title image


Smiley ShellAndWait-Funktion
Hi,



für dein geschildertes Problem müsste folgendes Modul die Lösung sein. Die darin enthaltene Funktion ShellAndWait ruft intern die API ShellExecuteEx kombiniert mit WaitForSingleObject bzw. WaitForInputIdle auf.



Syntax



Public Function ShellAndWait( _

   ByVal Operation As String, _

   ByVal FilePath As String, _

   Optional Parameter As String, _

   Optional WorkingFolder As String, _

   Optional WindowSize As ShowConstants = 1, _

   Optional WaitFor As WaitConstants = 0, _

   Optional Milliseconds As Long = -1, _

   Optional CloseProcess As Boolean = False _

) As String



Parameter



Operation (String)

  Sezifiziert die durchzuführende Aktion (z.B.: "Open" für Öffnen, "Edit" für Bearbeiten)

FilePath (String)

  Pfad der zu startenden Datei / Anwendung.

Parameter (String)

  Parameter, die an die aufzurufende Anwendung übergeben werden sollen.

WorkingFolder (String)

  Arbeitsverzeichnis in dem die Anwendung laufen soll.

WindowSize (ShowConstants)

  Sezifiziert die Fenstergröße (normal, maximiert, minimiert oder versteckt).

WaitFor (WaitConstants)

  Warten bis gestartete Anwendung initialisiert bz. beendet.

Milliseconds (Long)

  Warte maximal x Millisekunden auf die gestartete Anwendung (-1 = Kein Limit).

CloseProcess (Boolean)

  Soll die gestartete Anwendung nach Ablauf des Zeitlimits beendet werden (True) oder nicht (False).



Quelltext (Modul)



Public Declare Function WaitForInputIdle Lib "user32" ( _

   ByVal hProcess As Long, _

   ByVal dwMilliseconds As Long _

) As Long



Public Declare Function WaitForSingleObject Lib "kernel32" ( _

   ByVal hHandle As Long, _

   ByVal dwMilliseconds As Long _

) As Long



Private Declare Function TerminateProcess Lib "kernel32" ( _

   ByVal hProcess As Long, _

   ByVal uExitCode As Long _

) As Long



Private Declare Function ShellExecuteEx Lib "shell32.dll" Alias "ShellExecuteExA" ( _

   lpExecInfo As SHELLEXECUTEINFO _

) As Long



Private Type SHELLEXECUTEINFO

   cbSize As Long

   fMask As Long

   hwnd As Long

   lpVerb As String

   lpFile As String

   lpParameters As String

   lpDirectory As String

   nShow As Long

   hInstApp As Long

   lpIDList As Long

   lpClass As String

   hkeyClass As Long

   dwHotKey As Long

   hIcon As Long

   hProcess As Long

End Type



'SHELLEXECUTEINFO fMask-Konstanten

Private Const SEE_MASK_NOCLOSEPROCESS = &H40 'Füllt die Struktur Option hProcess mit dem Process Handle der gestarteten Anwendung

Private Const WAIT_OBJECT_0 = &H0 'Das



'SHELLEXECUTEINFO nShow-Konstanten

Public Enum ShowConstants

   Versteckt = 0    'Versteckt das Fenster

   Normal = 1       'Zeigt es ganz normal an

   Maximiert = 3    'Maximiert das Fenster

   Minimiert = 6    'Minimiert das Fenster

End Enum



Public Enum WaitConstants

    None = 0

    Initialisiert = 1

    Termination = 2

End Enum



Public Function ShellAndWait(ByVal Operation As String, _

                             ByVal FilePath As String, _

                             Optional Parameter As String, _

                             Optional WorkingFolder As String, _

                             Optional WindowSize As ShowConstants = 1, _

                             Optional WaitFor As WaitConstants = 0, _

                             Optional Milliseconds As Long = -1, _

                             Optional CloseProcess As Boolean = False) As String



   Dim Retval As Long

   Dim ShExInfo As SHELLEXECUTEINFO



   '//////////////////////////////////////////////////////////////////////////////

   ' Initialisierung

   '\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\



   If WorkingFolder = "" Then WorkingFolder = FilePath



   With ShExInfo

      .cbSize = Len(ShExInfo)

      .fMask = SEE_MASK_NOCLOSEPROCESS

      .hwnd = 0

      .lpVerb = Operation

      .lpFile = FilePath

      .lpParameters = Parameter

      .lpDirectory = WorkingFolder

      .nShow = WindowSize

   End With





   '/////////////////////////////////////////////////////////////////////////////

   ' Anwendung ausführen

   '\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\



   Retval = ShellExecuteEx(ShExInfo)



   If Retval = 0 Then

       'Ein Fehler ist aufgetreten

       ShellAndWait = ShellExecError(ShExInfo.hInstApp)

       Exit Function

   End If





   '/////////////////////////////////////////////////////////////////////////////

   ' Warten auf Prozess

   '\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\



   If WaitFor <> None Then



      If WaitFor = Initialisiert Then

         ' Warten bis die Anwendung initialisiert ist

         Retval = WaitForInputIdle(ShExInfo.hProcess, Milliseconds)



      Else

         ' Warten bis die Anwendung beendet

         Retval = WaitForSingleObject(ShExInfo.hProcess, Milliseconds)



      End If



      If Retval = WAIT_FAILED Then ShellAndWait = "Warten auf Prozess fehlgeschlagen."



   End If



   '/////////////////////////////////////////////////////////////////////////////

   ' SCHLIEßEN DES PROZESSES

   '\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

   If CloseProcess = True Then

      Retval = TerminateProcess(ShExInfo.hProcess, 1)

      If Retval <> 0 Then ShellAndWait = "Schließen der Anwendung fehlgeschlagen."

   End If



End Function



Private Function ShellExecError(ByVal ErrorCode As Integer) As String

      Select Case ErrorCode

          Case 2:  ShellExecError = Dateipfad & " wurde nicht gefunden."

          Case 3:  ShellExecError = Dateipfad & " wurde nicht gefunden."

          Case 5:  ShellExecError = "Zugriff verweigert."

          Case 8:  ShellExecError = "Nicht genügend Speicher verfügbar."

          Case 26: ShellExecError = Dateipfad & " konnte nicht göffnet werden da sie bereits verwendet wird."

          Case 27: ShellExecError = "Dateityp ist nicht ausreichend Assizoiert."

          Case 28: ShellExecError = "DDE Zeitlimit wurde ereicht."

          Case 29: ShellExecError = "DDE ist gescheitert."

          Case 30: ShellExecError = "DDE konnte nicht gestartet werden."

          Case 32: ShellExecError = "Eine benötigte Dll wurde nicht gefunden."

          Case 31: ShellExecError = Dateipfad & " ist mit keiner Anwendung verknüpft."

       End Select

End Function



Beispiel



Das folgende Beispiel ruft die Datei "C:\MeineBatch.bat" mit der Operation "Open" auf. Die Batch-Datei wird im Arbeitsverzeichnis "C:\" ausgeführt und das Fenster wird in der Größe "Normal" geöffnet. Parameter werden der Batch keine übergeben.



Danach soll die VB-Anwendung so lange warten, bis die aufgerufene Batch-Datei vollständig abgearbeitet wurde. Hierzu wurde der Parameter WaitFor auf Termination gesetzt. Nach überschreiten des definierten Zeitlimits von 60 Sekunden wird die Batch-Datei abgebrochen.



Private Sub Command1_Click()

   ShellAndWait "open", "c:\MeineBatch.bat", "", "C:\", Normal, Termination, 60000, True

End Sub



Gruß Andy



geschrieben von

Login

E-Mail:
  

Passwort:
  

Beitrag anfügen

Symbol:
 
 
 
 
 
 
 
 
 
 
 
 
 

Überschrift: