Home > Visual Basic Classic > Windows > Anwendung mit ShellExecute starten

Anwendung mit ShellExecute starten

Veröffentlicht am 17.10.2008 von Sebastian Krogolewski

Artikelinformationen

Sprache:
Visual Basic 6
Datenbank:
keine

Artikel speichern

del.icioMister WongGoogleLinkarenaYiggSpurlFurl

Artikel bewerten

Bewertng:4.40 / 5 (5 mal bewertet)

Manchmal ist es notwendig, eine fremde Anwendung zu starten. Visual Basic bietet uns hierfür den Befehl Shell an. Leider ist dieser etwas eingeschränkt und auf das Ausführen von Anwendungen oder Batch Dateien beschränkt.

Um ein PDF oder Word Dokument mit seiner Standardanwendung zu öffnen, ist es mit dem einfachen Befehl nicht ohne weiteres möglich. Die Win API Funktion ShellExecuteA bzw. ShellExecuteW aus der Kernel32.Dll ermöglicht uns dieses und noch mehr.

Mit dieser Funktion ist es nicht nur möglich Anwendungen zu starten, sondern auch Öffnen/Drucken einer Datei/ eines Dokuments mit seiner verknüpften Standardanwendung. Außerdem kann man eine URL mit dem Standardbrowser öffnen, eine e-Mail mit dem Standardemailprogramm verfassen oder auch den Windows Explorer und Suche in einem bestimmten Verzeichnis öffnen.

Am Ende des Artikels befinden sich einige Beispiele für diese Möglichkeiten. Dies ist keine vollständige Liste, wird aber mit neuen Beispielen mit der Zeit ergänzt.

 

Einbinden der Win API Funktion ShellExecuteA bzw. ShellExecuteW als ShellExecute aus der Kernel32.Dll:

1
2
3
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" ( _
    ByVal hWnd As Long, ByVal lOperation As String, ByVal lpFile As String, _
    ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

 

ShellExecuteA bzw. ShellExecuteW erwartet 6 Parameter:

hWnd: Das Handle des Besitzerfensters, welches verwendet wird um das User Interface und Fehlermeldungen anzuzeigen. Wenn NULL als Handle verwendet wird, ist der Vorgang mit keinem Fenster verknüpft.

lOperation: Zeiger auf einen Speicher, der den Vorgang als String mit abschließenden NULL beinhaltet. Folgende Werte werden am häufigsten verwendet:

 

Aktion Beschreibung
edit Öffnet das in lpFile angegebene Dokument mit der Standardanwendung zum Bearbeiten. Ist lpFile kein Dokument, schlägt die Funktion fehl.
explore Öffnet eine Explorerinstanz für den Pfad angegeben in lpFile.
find Öffnet den Suchdialog für den in lpDirectory angegebenen Pfad.
open Öffnet das in lpFile angegebene Element. Es kann eine Datei oder auch ein Verzeichnis sein.
print Druckt die in lpFile angegebene Datei. Ist die Datei kein Dokument, schlägt die Funktion fehl. 
NULL Vor Win 2000 wird die Standardaktion verwendet, wenn Sie in der Registry vorhanden und gültig ist, ansonsten wird die "open" Aktion verwendet. Ab Win 2000 wird die Standardaktion verwendet, wenn sie vorhanden ist. Wenn keine Standardaktion vorhanden ist, wird die "open" Aktion verwendet. Ist diese nicht verfügbar, wird die erste Aktion, welche in der Registry steht verwendet. Die Aktionen sind von der jeweiligen Datei oder dem jeweiligen Ordner abhängig. Die verfügbaren Aktionen aus dem Kontextmenü des Objekts stehen als Aktionen zur Verfügung.

 

lpFile: Zeiger auf reservierten Speicher, in welchem der String (mit NULL abschließend) die Datei oder Das Objekt zum Ausführen angibt. Um ein Shell-Namespace-Objekt zu verwenden, muss ein voll qualifizierter Name übergeben werden. Wenn für lpDirectory ein relativer Pfad angegeben wird, sollte bei lpFile ein absoluter verwendet werden.

lpParameters: Zeiger auf reservierten Speicher, welcher die Parameter für eine ausführbare Datei als String (mit NULL abschließend) übergibt. Das Format dieses Strings wird abhängig der verwendeten Aktion bestimmt.

lpDirectory: Zeiger auf reservierten Speicher, welcher das Arbeitsverzeichnis als String (Mit NULL abschließend) für die Aktion definiert. Wenn NULL übergeben wird, wird der aktuelle Pfad als Arbeitsverzeichnis verwendet. Wird für lpFile ein relativer Pfad verwendet, sollte bei lpDirectory ein absoluter verwendet werden.

nShowCmd: Numerischer Wert, welcher definiert, wie die Anwendung gestartet und angezeigt werden soll. Der Wert wird an die startende Anwendung direkt übergeben, die dann selbstständig entscheidet, wie dieser verarbeitet wird. Folgende Werte werden unterstützt:

 

Konstante Wert Beschreibung
SW_MAXIMIZE &H3 Maximiert das Fenster und das aktive Fenster bleibt aktiv.
SW_MINIMIZE &H6 Minimiert das Fenster.
SW_RESTORE &H9 Aktiviert das Fenster und zeigt es an. Ist das Fenster maximiert oder minimiert, stellt es die ursprüngliche Größe wieder her.
SW_SHOW &H5 Aktiviert das Fenster und zeigt es an der aktuellen Position und Größe an.
SW_SHOWDEFAULT &HA Sets the show state based on the SW_ flag specified in the STARTUPINFO structure passed to the CreateProcess function by the program that started the application. An application should call ShowWindow with this flag to set the initial show state of its main window.
SW_SHOWMAXIMIZED &H3 Aktiviert das Fenster und maximiert es.
SW_SHOWMINIMIZED &H2 Aktiviert das Fenster und minimiert es.
SW_SHOWMINNOACTIVE &H7 Minimiert das Fenster und das aktive Fenster bleibt aktiv.
SW_SHOWNA &H8 Fenster wird im aktuellen Zustand angezeigt und das aktive Fenster bleibt aktiv.
SW_SHOWNOACTIVATE &H4 Zeigt das Fenster an seiner letzten Position und Größe an und das aktive Fenster bleibt aktiv.
SW_SHOWNORMAL &H1 Fenster anzeigen und aktivieren. Wenn Fenster maximiert oder minimiert ist wird Originalgröße und Position wiederhergestellt. Wird verwendet, wenn das Fenster das erste mal angezeigt wird

 

 

Rückgabewert:

Für die Abwärtskompatibilität mit 16 Bit Anwendungen wird der Rückgabewert als HINSTANCE gecastet. Es ist aber keine echte HINSTANCE und das Einzige was man machen kann, ist diesen Wert zu einem integer zu casten und auf > 32 oder einen der Fehlercodes vergleichen.

Bei Erfolg: Wenn die Funktion erfolgreich ausgeführt wurde, wird ein Wert > 32 zurückgeliefert.

Bei Fehlschlag: Wenn die Funktion fehlgeschlagen ist wird ein Wert <= 32 zurückgeliefert. Folgende Tabelle zeigt die Fehlercodes mit Konstantennamen und Beschreibung.

 

Konstante Wert Beschreibung
ERROR_OUT_OF_MEM &H0 Nicht genügend Arbeitsspeicher.
ERROR_FILE_NOT_FOUND &H2 Die angegebene Datei wurde nicht gefunden.
ERROR_PATH_NOT_FOUND &H3 Der angegebene Pfad wurde nicht gefunden.
ERROR_BAD_FORMAT &HB Die .exe Datei ist keine gültige Microsoft Win32 .exe.
SE_ERR_ACCESSDENIED &H5 Der Zugriff wurde auf die angegebene Datei verweigert.
SE_ERR_ASSOCINCOMPLETE &H1B The file name association is incomplete or invalid.
SE_ERR_DDEBUSY &H1E The Dynamic Data Exchange (DDE) transaction could not be completed because other DDE transactions were being processed.
SE_ERR_DDEFAIL &H1D The DDE transaction failed.
SE_ERR_DDETIMEOUT &H1C The DDE transaction could not be completed because the request timed out.
SE_ERR_DLLNOTFOUND &H20 Die angegebene DLL Datei wurde nicht gefunden.
SE_ERR_FNF &H2 Die angegebene Datei wurde nicht gefunden.
SE_ERR_NOASSOC &H1F Es ist keine Anwendung für die Dateierweiterung der angegeben Datei verknüpft. Der Fehler wird auch zurückgegeben, wenn man versucht, eine Datei zu drucken, die nicht gedruckt werden kann.
SE_ERR_OOM &H8 Es steht nicht genügend Arbeitsspeicher zur Verfügung, um den Vorgang zu beenden.
SE_ERR_PNF &H3 Der angegebene Pfad existiert nicht.
SE_ERR_SHARE &H1A Eine Zugriffsverletzung ist aufgetreten.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Definieren der Fehlerkonstanten:

1
2
3
4
56
7
8
9
1011
12
13
14
15
Private Const ERROR_OUT_OF_MEM As Integer = &H0        'Nicht genügend Arbeitsspeicher
Private Const ERROR_FILE_NOT_FOUND As Integer = &H2    'Die angegebene Datei wurde nicht gefunden
Private Const ERROR_PATH_NOT_FOUND As Integer = &H3    'Der angegebene Pfad wurde nicht gefunden
Private Const ERROR_BAD_FORMAT As Integer = &HB        'Die .exe Datei ist keine gültige Microsoft Win32 .exe
Private Const SE_ERR_ACCESSDENIED As Integer = &H5     'Der Zugriff wurde auf die angegebene Datei verweigertPrivate Const SE_ERR_ASSOCINCOMPLETE As Integer = &H1B 'The file name association is incomplete or invalid
Private Const SE_ERR_DDEBUSY As Integer = &H1E         'The Dynamic Data Exchange (DDE) transaction could not be completed because other DDE transactions were being processed.
Private Const SE_ERR_DDEFAIL As Integer = &H1D         'The DDE transaction failed.
Private Const SE_ERR_DDETIMEOUT As Integer = &H1C      'The DDE transaction could not be completed because the request timed out.
Private Const SE_ERR_DLLNOTFOUND As Integer = &H20     'Die angegebene DLL Datei wurde nicht gefundenPrivate Const SE_ERR_FNF As Integer = &H2              'Die angegebene Datei wurde nicht gefunden
Private Const SE_ERR_NOASSOC As Integer = &H1F         'Es ist keine Anwendung für die Dateierweiterung der angegeben Datei verknüpft. Der Fehler wird auch zurückgegeben wenn man versucht eine Datei zu drucken die nicht gedruckt werden kann.
Private Const SE_ERR_OOM As Integer = &H8              'Es steht nicht genügend Arbeitsspeicher zur Verfügung um den Vorgang zu beenden
Private Const SE_ERR_PNF As Integer = &H3              'Der angegebene Pfad existiert nicht
Private Const SE_ERR_SHARE As Integer = &H1A           'Eine Zugriffsverletzung ist aufgetreten

 

Deklaration der nShowCmd Konstanten:

1
2
3
4
56
7
8
9
1011
12
Private Const SW_HIDE As Long = &H0               'deaktiviert das Fenster und aktiviert ein anderes
Private Const SW_MAXIMIZE As Long = &H3           'Maximiert das Fenster und das aktive Fenster bleibt aktiv
Private Const SW_MINIMIZE As Long = &H6           'Minimiert das Fenster
Private Const SW_RESTORE As Long = &H9            'Aktiviert das Fenster und zeigt es an. Ist das Fenster Maximiert oder Minimiert stellt es die ursprüngliche größe wieder her.
Private Const SW_SHOW As Integer = &H5            'Aktiviert das Fenster und zeigt es an der aktuellen Position und Größe an.Private Const SW_SHOWDEFAULT As Integer = &HA     '
Private Const SW_SHOWMAXIMIZED As Integer = &H3   'Aktiviert das Fenster und Maximiert es
Private Const SW_SHOWMINIMIZED As Integer = &H2   'Aktiviert das Fenster und Minimiert es
Private Const SW_SHOWMINNOACTIVE As Integer = &H7 'Minimiert das Fenster und das aktive Fenster bleibt aktiv
Private Const SW_SHOWNA As Integer = &H8          'Fenster wird im aktuellen Zustand angezeigt und das aktive Fenster bleibt aktivPrivate Const SW_SHOWNOACTIVATE As Integer = &H4  'Zeigt das Fenster an seiner letzten Position und Größe an und das aktive Fenster bleibt aktiv
Private Const SW_SHOWNORMAL As Integer = &H1      'Fenster anzeigen und aktivieren. Wenn Fenster Maximiert oder Minimiert ist wird Originalgröße und Position wiederhergestellt. Wird verwendet wenn das Fenster das erste mal angezeigt wird

 

Ein VB Enum für die nShowCmd Konstanten:

1
2
3
4
56
7
8
9
1011
12
13
14
Private Enum enShowCMD
    vbHide = SW_HIDE
    vbMaximize = SW_MAXIMIZE
    vbMinimize = SW_MINIMIZE
    vbRestore = SW_RESTORE    vbShow = SW_SHOW
    vbShowDefault = SW_SHOWDEFAULT
    vbShowMaximized = SW_SHOWMAXIMIZED
    vbShowMinimized = SW_SHOWMINIMIZED
    vbShowMinNoActivate = SW_SHOWMINNOACTIVE    vbShowNa = SW_SHOWNA
    vbShowNoActive = SW_SHOWNOACTIVATE
    vbShowNormal = SW_SHOWNORMAL
End Enum

 

Anwendungsbeispiele:

Öffnen eines Word Dokuments mit Microsoft Word:

1
Call ShellExecute(&H0, "open", "C:\testdoc.doc", vbNullString, vbNullString, vbShowNormal)

Öffnen des Explorers in einem bestimmten Verzeichnis:

1
Call ShellExecute(&H0, "explore", "C:\", vbNullString, vbNullString, vbShowNormal)

Öffnen des Suchen Dialogs in einem bestimmten Verzeichnis:

1
Call ShellExecute(&H0, "find", vbNullString, vbNullString, "C:\", vbShowNormal)

Anzeigen des "Öffnen mit" Dialogs:

1
Call ShellExecute(&H0, vbNullString, "Rundll32.exe", "shell32.dll, OpenAs_RunDLL " & sFilename, sDirectory, vbShowNormal)

Anzeigen der Systemsteuerung

1
Call ShellExecute(&H0, vbNullString, "Rundll32.exe", "shell32.dll, Control_RunDLL", vbNullString, vbShowNormal)

e-Mail schreiben mit Standard e-Mail Programm:

1
 

URL mit Standardbrowser Öffnen:

1
 

Downloads

Suchbegriffe

VB6, Visual Basic, ShellExecute, ShellExecuteA, ShellExecuteW

Suche