Standardprogramm zum Öffnen herausfinden

Ich war mal so frei und habe unsere Lösung auf mein Wiki gesetzt.
Wenn Ich habe euch, Zvoni und DrMueller, dabei zitiert. Bei Einwänden nehm ich natürlich wieder weg.

File Informationen

Und zwar gehts um die 2 folgenden Funktionen
Visual Basic:
'/**
' * Gibt die "Befehlszeile" aus, mit der die Datei geöffnet wird
' * @example    debug.print getFileTypeCommand("help.chm")
' *             -> "C:\Windows\hh.exe" %1
' * @param  String      Dateiname/Dateipfad
' * @return String      Pfad mit der die Datei geöffnet wird
' */
Public Function getFileTypeCommand(ByVal iFileName As String) As String
    Dim objReg      As Object
    Dim extension   As String
    Dim key         As String
    Dim fso         As New FileSystemObject
    Const HKEY_CLASSES_ROOT = &H80000000
    
    'Dateiendung auslesen
    extension = fso.GetExtensionName(iFileName)
    
    'Registry-Objekt anlegen
    Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
    
    'Key auslesen
    objReg.GetStringValue HKEY_CLASSES_ROOT, "." & extension, "", key
    
    'Aufruf ausgeben
    key = key & "\shell\Open\command"
    objReg.GetStringValue HKEY_CLASSES_ROOT, key, "", getFileTypeCommand
    
    'Registry-Objekt zerstören
    Set objReg = Nothing
    Set fso = Nothing
End Function

'/**
' * Gibt die Programmbeschreibung der Datei aus
' * @example    debug.print getFileTypeDescription("help.chm")
' *             -> Compiled HTML Help file
' * @param  String      Dateiname/Dateipfad
' * @return String      Beschreibung
' */
Public Function getFileTypeDescription(ByVal iFileName As String) As String
    Dim objReg      As Object
    Dim extension   As String
    Dim key         As String
    Dim fso         As New FileSystemObject
    Const HKEY_CLASSES_ROOT = &H80000000
    
    'Dateiendung auslesen
    extension = fso.GetExtensionName(iFileName)
    
    'Registry-Objekt anlegen
    Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
    
    'Key auslesen
    objReg.GetStringValue HKEY_CLASSES_ROOT, "." & extension, "", key
    
    'Aufruf ausgeben
    objReg.GetStringValue HKEY_CLASSES_ROOT, key, "", getFileTypeDescription
    
    'Registry-Objekt zerstören
    Set objReg = Nothing
    Set fso = Nothing
End Function
 
Yaslaw,

ich habe kein Problem damit, auch wenn ich die Verwendung des WMI und FSO als unschön empfinde.

Dazu bin ich zu sehr Purist, und ich versuche, Bindungen zur Laufzeit möglichst zu vermeiden.

Persönlich würde ich es per API-Calls machen, aber das ist Geschmackssache.

Gibts ne Adresse zu deinem Wiki?
 
Hallo Leute,

war in den Ferien, daher bin ich jetzt wieder dran.
Die Lösung sieht gut aus, es geht mir auch hauptsächlich im doc,docx,xls,xlsx und dann eben die entsprechenden OO Dateien.

Danke nochmal für den interessanten Dialog, hat mir, und ich denke auch Anderen, sehr geholfen.
 
Würde es mir jetzt jemand glauben, dass ich genau diesen Code eben selbst gebrauchen konnte? ;-)

Hintergrund: UserForm/Makro in Word (2003-Format), welches Daten aus einem ListView nach Excel exportieren soll, aber abhängig von der verwendeten Office-Version (2003, 2007, 2010) als ".xls" bzw ".xlsx" zur Laufzeit dynamisch die entsprechende Excel-Bibliothek als Verweis setzen muss. Und dafür brauch ich ja den Pfad zur EXCEL.EXE

Funktioniert Bombe!

An Yaslaw: Ätsch! Habs mit API gemacht :D
 
Habs mir in ne Klasse gebaut.

Argumente von GetTypeInfoFromReg: FileExtension = String, UseUnicodeAPI = Boolean

Code ist frei verwendbar und anpassbar. In der verfügbaren Zeit konnte ich nicht alle Fehler abhandlen.

Ich weiss, dass die Ermittlung von EXEPath noch Buggy ist, sofern es keine "echten" Pfade sind (Dieses "%SystemRoot%"-Zeug). Müsst ich noch dran arbeiten.

Verwendung:
Visual Basic:
'In einem Standard-Modul
Private/Public MyType As CTypeRegInfo

Private/Public Sub Irgendwas()
    
    Set MyType = New CTypeRegInfo
    
    MyType.GetTypeInfoFromReg ".docx", True
    Debug.Print MyType.EXEPath

End Sub

Visual Basic:
'In einem Objekt-Modul (Klasse, Form)

Private WithEvents MyType As CTypeRegInfo

Private Sub MyType_APICallError(ByVal ErrorCode As Long, ErrorMessage As String, ByVal IsUnicode As Boolean)

    Debug.Print ErrorCode & " - " & ErrorMessage & " - " & IsUnicode

End Sub

Private Sub Irgendwas()
    
    Set MyType = New CTypeRegInfo
    
    MyType.GetTypeInfoFromReg ".docx", True
    Debug.Print MyType.EXEPath

End Sub
 

Anhänge

Zuletzt bearbeitet:
Hier jetzt die verbesserte Version. Sollte jetzt auch dieses SystemRoot-zeug erkennen.
 

Anhänge

Zuletzt bearbeitet:
Zurück