Aus Visual Basic heraus Dokumente in zugehörigen Anwendungen öffnen
Veröffentlicht: 14. Jul 2002 | Aktualisiert: 22. Jun 2004
Von Mathias Schiffer
Dieser msdn online Quickie zeigt Ihnen, wie eine Visual-Basic-Anwendung Dokumente oder Webseiten in ihren zugeordneten Anwendungen öffnet.
Der Windows Explorer öffnet auf einen Doppelklick auf eine Dokumentendatei hin das Dokument in der zugeordneten Anwendung. So bewirkt etwa ein Doppelklick auf eine *.TXT-Datei, dass diese üblicherweise im Windows Editor (notepad.exe) geöffnet wird.
Ist eine Dateiendung keiner Anwendung zugeordnet, öffnet sich nach dem Doppelklick der Dialog "Öffnen mit...", in dem Sie als Endanwender angeben können, mit welcher Anwendung Sie den bisher unbekannten Dateityp öffnen möchten.
Ähnlich haben Sie die Möglichkeit, über den Menüpunkt Ausführen im Windows Start-Menü Webseiten abzurufen. Geben Sie einfach einen URL an. Die Webseite wird daraufhin in Ihrem Standard-Webbroser angezeigt. Geben Sie mailto: und folgend eine E-Mail-Adresse an, öffnet sich Ihr Standard-Mailprogramm und präsentiert Ihnen ein leeres E-Mail-Formular, in das die Empfängeradresse bereits eingetragen ist.
So geht das mit Visual Basic
Versuchen Sie, das beschriebene Verhalten in einem Visual-Basic-Programm zu erreichen, werden Sie von der Shell-Funktion lediglich mit mehr oder weniger kreativen Fehlermeldungen abgespeist:
Shell "c:\test.txt" ' Fehler 5: Ungültiger Prozeduraufruf ' oder ungültiges Argument Shell "/germany/" ' Fehler 53: Datei nicht gefunden Shell "mailto:msdn@aixsoft.de" ' Fehler 53: Datei nicht gefunden
Tatsächlich ist die Shell-Funktion in Visual-Basic-Programmen für dieses Ansinnen ungeeignet.
Die API-Funktion ShellExecute jedoch beherrscht die angesprochenen Möglichkeiten:
Private Declare Function ShellExecute _ Lib "shell32.dll" Alias "ShellExecuteA" ( _ ByVal hWnd As Long, _ ByVal Operation As String, _ ByVal Filename As String, _ Optional ByVal Parameters As String, _ Optional ByVal Directory As String, _ Optional ByVal WindowStyle As Long = vbMinimizedFocus _ ) As Long
Im Parameter hWnd übergeben Sie der Funktion ein Handle eines Fensters (etwa mithilfe der hWnd-Eigenschaft einer Form), das als Elternfenster für die Ausgabe eventueller Fehlermeldungen dienen soll. Auch eine Übergabe von 0 ist hier zulässig.
Dem Parameter Operation übergeben Sie den String "Open", der das Öffnen der in Filename angegebenen Datei bewirkt.
Für Parameters müssen Sie üblicherweise keine Informationen übergeben.
Auch die Angabe eines Arbeitsverzeichnisses im Argument Directory ist für unseren Zweck normalerweise entbehrlich.
Im letzten Parameter WindowStyle, geben Sie an, auf welche Weise die der Datei zugeordnete Anwendung dargestellt werden soll: Er gleicht im wesentlichen dem Parameter WindowStyle der Shell-Funktion und ist wie die beiden zuvor besprochenen Parameter in der obigen Deklaration mithilfe des Schlüsselworts Optional als wahlweise übergebbar markiert.
Im einfachsten Fall sieht der Aufruf von ShellExecute so aus:
Dim lSuccess As Long lSuccess = ShellExecute(0, "Open", "c:\test.txt") lSuccess = ShellExecute(0, "Open", "/germany/") lSuccess = ShellExecute(0, "Open", "mailto:msdn@aixsoft.de")
Die Funktion ShellExecute berichtet in ihrem Rückgabewert über den Erfolg des versuchten Aufrufs: Ist der Rückgabewert größer als 32, war der Aufruf erfolgreich. Besondere Aufmerksamkeit verdient dabei der Rückgabewert 31, dem der symbolische Konstantenname SE_ERR_NOASSOC zukommt: Gibt ShellExecute diesen Wert zurück, so besteht keine Anwendungs-Zuordnung zwischen dem angegebenen Dateityp und einem Anwendungsprogramm.
Dieser Umstand kann genutzt werden, um für die nicht geöffnete Datei im Stil des Windows Explorers den Dialog "Öffnen mit..." anzuzeigen. Der Dialog lässt sich unter Übergabe des Dateinamens mithilfe des Windows-Helferleins RunDLL32.exe anzeigen:
Shell "RunDLL32 shell32.dll,OpenAs_RunDLL " & Filename
Beispielcode
Der folgende Quelltext vereint die Informationen dieses Artikels in der einfach anzuwendenden Funktion LaunchDocument, die Sie zum Öffnen von Dokumentendateien in zugehörigen Anwendungen, zur Anzeige von Webseiten oder zum Öffnen eines neuen E-Mail-Formulars verwenden können.
--- Notwendige API-Deklarationen: Private Const SE_ERR_NOASSOC As Long = 31& Private Declare Function ShellExecute _ Lib "shell32.dll" Alias "ShellExecuteA" ( _ ByVal hWnd As Long, _ ByVal Operation As String, _ ByVal Filename As String, _ Optional ByVal Parameters As String, _ Optional ByVal Directory As String, _ Optional ByVal WindowStyle As Long = vbMinimizedFocus _ ) As Long ' --- LaunchDocument öffnet eine Dokumentendatei Public Function LaunchDocument(ByRef Filename As String, _ Optional ByVal ParentForm As Form, _ Optional ByVal ShowOpenWithDialog As Boolean = False, _ Optional ByVal WindowStyle As VBA.VbAppWinStyle = vbMinimizedFocus _ ) As Boolean ' ------------------------------------------------------------------ ' Startet eine existierende Datei in der mit ihr verknüpften ' Anwendung (wie bei Doppelklick im Windows Explorer). Besteht zu ' einer Dateinamenserweiterung keine zugehörige Verknüpfung zu einer ' Anwendung, kann der "Öffnen mit"-Dialog angezeigt werden, in dem ' der Endanwender auf Wunsch eine Anwendung zuordnen kann ' (ShowOpenWithDialog = True). ' ------------------------------------------------------------------ Dim lSuccess As Long Dim hWndParent As Long ' Falls eine Parent-Form übergeben wurde, deren ' Fensterhandle für den ShellExecute-Aufruf verwenden ' (sonst 0). If Not ParentForm Is Nothing Then hWndParent = ParentForm.hWnd End If ' Versuchen, das Dokument mittels ShellExecute in der ' zugehörigen Anwendung zu öffnen: lSuccess = ShellExecute(hWndParent, "Open", Filename, _ vbNullString, vbNullString, _ WindowStyle) ' Rückgabewert prüfen: Select Case lSuccess Case Is > 32 ' Aufruf erfolgreich LaunchDocument = True Case SE_ERR_NOASSOC ' Keine verknüpfte Anwendung ' Falls ShowOpenWithDialog = True, wird der Dialog ' "Öffnen mit" für diese Datei angezeigt: If ShowOpenWithDialog Then Shell "RunDLL32 shell32.dll,OpenAs_RunDLL " & Filename ' Die Auswahlmöglichkeit wird als Erfolg gewertet: LaunchDocument = True End If Case Else ' ShellExecute war erfolglos. ' Boolean-Standardwert False zurückgeben End Select End Function