Rubrik: Dateisystem | 15.04.02 |
ShellExecuteEx-Funktion Diese Funktion startet ein Programm oder öffnet ein Dokument mit dem assoziierten Programm und gibt Informationen über das gestartete Programm zurück. | ||
Betriebssystem: Win95, Win98, WinNT 4.0, Win2000, WinME | Views: 27.469 |
Deklaration:
Declare Function ShellExecuteEx Lib "shell32.dll" _ Alias "ShellExecuteExA" ( _ lpExecInfo As SHELLEXECUTEINFO) As Long
Beschreibung:
Diese Funktion startet ein Programm oder öffnet ein Dokument mit dem assoziierten Programm und gibt Informationen über das gestartete Programm zurück.
Parameter:
lpExecInfo | Erwartet eine SHELLEXECUTEINFO-Struktur, die Informationen über das zustartende Programm enthält. |
Rückgabewert:
Ist die Funktion erfolgreich, so ist die Rückgabe "ungleich 0", andernfalls istdie Rückgabe "0".
Beispiel:
Private Declare Function ShellExecuteEx Lib "shell32.dll" _ Alias "ShellExecuteExA" ( _ lpExecInfo As SHELLEXECUTEINFO) As Long Private Declare Function WaitForSingleObject Lib "kernel32.dll" ( _ ByVal hHandle As Long, _ ByVal dwMilliseconds As Long) 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_CLASSKEY = &H3 ' Struktur wird mit dem Handle des Registry - ' Schlüssels für die Klasse gefüllt Private Const SEE_MASK_CLASSNAME = &H1 ' Struktur wird mit dem Klassennamen oder GUID ' gefüllt der die Datei beschreibt Private Const SEE_MASK_CONNECTNETDRV = &H80 ' Struktur verbindet den PC mit einem ' Netzlaufwerk falls nötig, lpFile muss der UNC-Pfadname in dem Netzwerk sein Private Const SEE_MASK_DOENVSUBST = &H200 ' Struktur wird mit Umgebungsvariablen des ' Programms gefüllt, diese werden in lpDirectory oder lpFile gepackt Private Const SEE_MASK_FLAG_DDEWAIT = &H100 ' die Funktion wartet, dass die DDE ihre ' Vorgänge abgeschlossen hat und kehrt dann erst zurück Private Const SEE_MASK_FLAG_NO_UI = &H400 ' die Funktion zeigt keine ' Fehler-Dialogboxen an Private Const SEE_MASK_HOTKEY = &H20 ' dwHotkey wird gefüllt Private Const SEE_MASK_ICON = &H10 ' hIcon wird gefüllt mit dem Icon-Handle des ' Standard-Icons der Anwendung Private Const SEE_MASK_IDLIST = &H4 ' benutzt die lpIDLIST-Option um das Programm zu ' starten, das in ihr beschrieben ist Private Const SEE_MASK_INVOKEIDLIST = &HC ' benutzt die lpIDLIST-Option um das ' Programm zu starten, das in ihr beschrieben ist Private Const SEE_MASK_NOCLOSEPROCESS = &H40 ' füllt die Struktur-Option hProcess ' mit dem Process-Handle der gestarteten Anwendung ' SHELLEXECUTEINFO nShow-Konstanten Private Const SW_HIDE = 0 ' versteckt das Fenster Private Const SW_MAXIMIZE = 3 ' maximiert das Fenster Private Const SW_MINIMIZE = 6 ' minimiert das Fenster Private Const SW_RESTORE = 9 ' stellt das Fenster wieder her Private Const SW_SHOW = 5 ' zeigt das Fenster an Private Const SW_SHOWMAXIMIZED = 3 ' zeigt das Fenster maximiert an Private Const SW_SHOWMINIMIZED = 2 ' zeigt das Fenster minimiert an Private Const SW_SHOWMINNOACTIVE = 7 ' zeigt das Fenster minimiert an, aber aktiviert ' es nicht Private Const SW_SHOWNA = 8 ' zeigt das Fenster an, aber aktiviert es nicht Private Const SW_SHOWNOACTIVATE = 4 ' zeigt das Fenster in der besten Größe und ' Position an, aber aktiviert es nicht Private Const SW_SHOWNORMAL = 1 ' zeigt das Fenster ganz normal an ' SHELLEXECUTEINFO hInstApp Rückgabe-Konstanten Private Const SE_ERR_ACCESSDENIED = 5 ' Zugriff verweigert Private Const SE_ERR_ASSOCINCOMPLETE = 27 ' Dateityp ist nicht ausreichend assoziiert Private Const SE_ERR_DDEBUSY = 30 ' DDE konnte nicht gestartet werden Private Const SE_ERR_DDEFAIL = 29 ' DDE ist gescheitert Private Const SE_ERR_DDETIMEOUT = 28 ' DDE-Zeitlimit wurde ereicht Private Const SE_ERR_DLLNOTFOUND = 32 ' eine benötigte Dll wurde nicht gefunden Private Const SE_ERR_FNF = 2 ' Datei wurde nicht gefunden Private Const SE_ERR_NOASSOC = 31 ' Dateityp ist nicht assoziiert Private Const SE_ERR_OOM = 8 ' nicht genügend Speicher verfügbar Private Const SE_ERR_PNF = 3 ' Pfad wurde nicht gefunden Private Const SE_ERR_SHARE = 26 ' Datei konnte nicht geöffnet werden, da sie bereits ' verwendet wird ' SHELLEXECUTEINFO dwHotKey-Konstanten Private Const HOTKEYF_ALT = &H4 ' benutzt ALT für den Hotkey Private Const HOTKEYF_CONTROL = &H2 ' benutzt STRG für den Hotkey Private Const HOTKEYF_EXT = &H8 ' benutzt den Extendend-Key für den Hotkey Private Const HOTKEYF_SHIFT = &H1 ' benutzt Shift für den Hotkey ' WaitForSingleObject dwMillisekond-Konstante Private Const INFINITE = &HFFFF ' unendlich warten ' WaitForSingleObject Rückgabe-Konstanten Private Const WAIT_ABANDONED = &H80 ' der Mutex, der in hHanlde angegeben ist wird ' nicht freigegeben, so lange der Eltern-Thread zerstört ist. Der Mutex ist nun ' Bestandteil des aufrufenden Threads und ist nicht mehr im signalisierenden Status Private Const WAIT_FAILED = &HFFFFFFFF ' die Funktion ist gescheitert Private Const WAIT_OBJECT_0 = &H0 ' das Objekt. das in hHandle spezifiziert ist, ' ist in einem signalisierendem Status Private Const WAIT_TIMEOUT = &H102 ' das Zeitlimit für eine Änderung des ' Thread-Statuses ist abgelaufen
' Editor mit der Autoexec.bat Datei öffnen Private Sub Command1_Click() Dim Retval As Long, ShExInfo As SHELLEXECUTEINFO ' Startoptionen festlegen With ShExInfo .cbSize = Len(ShExInfo) .fMask = SEE_MASK_FLAG_NO_UI Or SEE_MASK_CLASSNAME Or SEE_MASK_NOCLOSEPROCESS .hwnd = Me.hwnd .lpVerb = "open" .lpFile = "c:\windows\notepad.exe" .lpParameters = "c:\autoexec.bat" .lpDirectory = "c:\" .nShow = SW_SHOWMAXIMIZED End With ' Programm ausführen Retval = ShellExecuteEx(ShExInfo) If Retval = 0 Then ' bei Fehler Text ausgeben Select Case ShExInfo.hInstApp Case SE_ERR_ACCESSDENIED Err.Raise 5, "ShellExecuteEx", "Zugriff verweigert" Case SE_ERR_FNF Err.Raise 5, "ShellExecuteEx", "Datei nicht gefunden" Case SE_ERR_NOASSOC Err.Raise 5, "ShellExecuteEx", "Datei ist mit keinem Programm verknüpft" End Select Else ' andernfalls Programmdaten ausgeben Debug.Print "Datei gestartet: " & ShExInfo.lpFile Debug.Print "Dateiklasse: " & ShExInfo.lpClass Debug.Print "Prozess Handle: " & ShExInfo.hProcess Debug.Print "Instanz Handle:" & ShExInfo.hInstApp End If ' warten bis die Anwendung beendet wird Do DoEvents Loop Until WaitForSingleObject(ShExInfo.hProcess, 0) << WAIT_TIMEOUT ' beenden des Programms signalisieren MsgBox "Das Programm wurde beendet" End Sub