Für die meisten Dateitypen gibt es eine Standard-Anwendung, die beispielsweise beim (Doppel)Klick auf eine Datei (auf ein "Dokument") dieses Typs im Explorer (oder von der API-Funktion ShellExecute bzw. ShellExecuteEx) mit dieser Datei gestartet wird. Wenn Sie diese Anwendung und den Pfad zu ihr in Erfahrung bringen möchten, hilft Ihnen die Shell-API-Funktion FindExecutable.
Private Declare Function FindExecutable Lib "shell32.dll" _
Alias "FindExecutableA" (ByVal lpFile As String, _
ByVal lpDirectory As String, ByVal lpResult As String) As Long
Sie übergeben ihr im ersten Parameter den Namen eines Dokuments, wobei der Name gleich eine vollständige Pfadangabe darstellen kann. Sie können aber auch lediglich den reinen Dokumentnamen übergeben und den Pfad im zweiten Parameter nachreichen. Im dritten Parameter übergeben Sie einen mindestens 255 (Leer-)Zeichen langen String. Nach dem Aufruf der Funktion wird Ihnen in diesem String der Pfad zur Standard-Anwendung des Dokuments zurück gegeben. Das Ende des Pfad wird durch ein Nullzeichen (Chr$(0)) markiert - mit Hilfe der Left$-Funktion und einer weiteren API-Funktion (InStrNullChar, siehe auch "Null-Schneider") schneiden Sie den Rest des Strings ab dieser Stelle ab. Konnte die Datei nicht gefunden werden, gibt FindExecutable den Fehlerwert 2 zurück, existiert keine Standard-Anwendung zu dem Dokument, gibt sie den Fehlerwert 31 zurück.
Die folgende Funktion GetExecutable verpackt den Aufruf. Auch hier können Sie im ersten Parameter den kompletten Pfad zu einem Dokument oder den Dokument-Namen alleine und im zweiten Parameter den Pfad dazu angeben. Im optionalen dritten Parameter geben Sie an, ob ein abfangbarer Laufzeitfehler ausgelöst werden soll, wenn FindExecutable einen Fehlerwert zurückgibt, oder ob einfach nur ein leerer String zurück gegeben werden soll.
Private Declare Function FindExecutable Lib "shell32.dll" _
Alias "FindExecutableA" (ByVal lpFile As String, _
ByVal lpDirectory As String, ByVal lpResult As String) As Long
Private Declare Function InStrNullChar Lib "kernel32.dll" _
Alias "lstrlenA" (ByVal lpString As Any) As Long
Public Enum GetExecErrorConstants
geErrFileNotFound = 2
geErrNoAssociation = 31
End Enum
Public Function GetExecutable(Document As String, _
Optional Path As String, _
Optional ByVal RaiseErr As Boolean) As String
Dim nExecutable As String * 255
Dim nRet As Long
nRet = FindExecutable(Document, Path, nExecutable)
Select Case nRet
Case geErrFileNotFound, geErrNoAssociation
If RaiseErr Then
Err.Raise nRet
End If
Case Else
GetExecutable = Left$(nExecutable, InStrNullChar(nExecutable))
End Select
End Function
|