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