Standardprogramm zum Öffnen herausfinden

DrMueller

Erfahrenes Mitglied
Hallo Leute,

folgendes Problem: Wir haben die Dokumenterstellung so programmiert, dass wir die Endung prüfen und entsprechend das Programm initialisieren, also bei DOT wird Microsoft Office initialisiert, bei OpenOffice-Vorlagen entsprechend OO etc.

Das Problem ist, dass ja auch Openoffice entsprechend Word-Vorlagen öffnen sollte, dazu habe ich diesen Code reinprogrammiert:
Code:
Private Function checkGetExecutable(mFile As String) As String
  'http://www.vb-fun.de/cgi-bin/loadframe.pl?ID=vb/tipps/tip0147.shtml
  On Error GoTo checkGetExecutable_Error
  Dim thisReturnValue As String
  Dim thisEXE As String
  Dim thisPfad As String
  Dim thisDatName As String
  Dim thisResult As Long

  thisEXE = Space(254) & Chr(0)
  thisPfad = FilesPath(mFile)
  thisDatName = FilesName(mFile)
  thisResult = FindExecutable(thisDatName, thisPfad, thisEXE)
  
  thisReturnValue = Left(thisEXE, InStr(thisEXE, Chr(0)))

checkGetExecutable_Ende:
  On Error Resume Next
  checkGetExecutable = thisReturnValue
  Exit Function

checkGetExecutable_Error:
  Debug.Print Err.Description & "(" & Err.Number & ")" & " checkGetExecutable in clsBookmarks "
  Debug.Assert (Err = False)
  On Error Resume Next
  WriteDBGView Err.Description & "(" & Err.Number & ")" & " checkGetExecutable in clsBookmarks ", App.EXEName
  GoTo checkGetExecutable_Ende
  Resume
End Function

Leider funktioniert der gar nicht, Rückgabewert ist ein leerer String.

Kennt da jemand einen anderen Weg, ich wie das Standardprogramm zu einer Datei herausfinden kann, oder ist mein Code irgendwie fehlerhaft?


Wie immer danke ich im Voraus und verbleibe mit freundlichen Grüssen


Müller Matthias
 
Müsste das nicht in der Registry im Class-Root stehen?

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.dot]
"Content Type"="application/msword"
@="Word.Template.8"

[HKEY_CLASSES_ROOT\.dot\PersistentHandler]
@="{98DE59A0-D175-11CD-A7BD-00006B827D94}"

[HKEY_CLASSES_ROOT\.dot\ShellEx]

[HKEY_CLASSES_ROOT\.dot\ShellEx\{8895b1c6-b41f-4c1c-a562-0d564250836f}]
@="{84F66100-FF7C-4fb4-B0C0-02CD7FB668FE}"

[HKEY_CLASSES_ROOT\.dot\Word.Template.8]

[HKEY_CLASSES_ROOT\.dot\Word.Template.8\ShellNew]
 
Da hab ich auch schon gesucht. Doch wie komme ich in der Registry von .doc aud die Applikation? Ich sehe in deinen aufgelisteten Keys noch kein Weg die aufzurufende Applikation eindeutig auszulesen
 
Ist klassische Rekursion durch einen Verzeichnis-Baum

per GetSetting aus der Registry rausholen:

[HKEY_CLASSES_ROOT\.dot\ShellEx\{8895b1c6-b41f-4c1c-a562-0d564250836f}]
@="{84F66100-FF7C-4fb4-B0C0-02CD7FB668FE}"

Dann per Getsetting Schlüssel "{84F66100-FF7C-4fb4-B0C0-02CD7FB668FE}" aus "HKEY_CLASSES_ROOT\CLSID\" auslesen.


Unter LocalServer32 findest du dann die EXE

[HKEY_CLASSES_ROOT\CLSID\{84F66100-FF7C-4fb4-B0C0-02CD7FB668FE}]
@="Microsoft Word-Vorschau"
"DisplayName"="Microsoft Word-Vorschau"
"DisableLowILProcessIsolation"=dword:00000001

[HKEY_CLASSES_ROOT\CLSID\{84F66100-FF7C-4fb4-B0C0-02CD7FB668FE}\InprocHandler32]
@="ole32.dll"

[HKEY_CLASSES_ROOT\CLSID\{84F66100-FF7C-4fb4-B0C0-02CD7FB668FE}\LocalServer32]
@="C:\\PROGRA~1\\MICROS~1\\Office14\\WINWORD.EXE"
 
Das geht so bei Microsoft-Programmen 2003. Aber bereits .jpg geht so nicht mehr.....
Acuh xlsx kann so nicht aufgelöst werden

Leider kenne ich die Registry zu wenig um da herauszufinden wie da die Zusammenhänge der verschiedenen Schlüsseln ist.

Visual Basic:
    Dim objReg      As Object
    Dim strKeyPath  As String
    Dim arrSubKeys  As Variant
    Dim subkey      As String
    Dim strValue    As String
    Dim strKey      As String
    
    Const HKEY_CLASSES_ROOT = &H80000000
    
    'Registry-Objekt anlegen
    Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
    
    'Erste Krüppelnummer auslesen
    strKeyPath = ".xls\ShellEx"
    objReg.EnumKey HKEY_CLASSES_ROOT, strKeyPath, arrSubKeys
    subkey = CStr(arrSubKeys(0))
    
    strKeyPath = strKeyPath & "\" & subkey
    objReg.GetStringValue HKEY_CLASSES_ROOT, strKeyPath, "", strKey
    
    ' Text auslesen
    strKeyPath = "CLSID\" & strKey
    objReg.GetStringValue HKEY_CLASSES_ROOT, strKeyPath, "DisplayName", strValue
    
    Debug.Print strValue
    
    ' Programmpfad auslesen
    strKeyPath = "CLSID\" & strKey & "\LocalServer32"
    objReg.GetStringValue HKEY_CLASSES_ROOT, strKeyPath, "", strValue
    
    Debug.Print strValue
    
    'Registry-Objekt zerstören
    Set objReg = Nothing
 
Ich bin ein Depp!

Ich entschuldige mich!

Wenn du mal beide Typen in der Class-Root (oder auch in HKLM) anschaust, dann siehst du bei ".jpg" als (Standard)-Wert "jpegfile"

Wenn du jetzt in der Registry in der Class-Root nach dem Schlüssel "jpegfile" suchst, landest du hier:

[HKEY_CLASSES_ROOT\jpegfile\shell\open\command]

Dasselbe bei ".dot": Da steht Word.Template.8 (oder sowas) genau danach weitersuchen

HKEY_CLASSES_ROOT\Word.Template.8\shell\Open\command

und dort findest unter (Standard) das jeweilige Programm, mit dem es ausgeführt wird.

Sorry nochmal, hab selbst nicht genau geschaut.
 
Das machts ja noch viel einfacher *g*

Visual Basic:
    Dim objReg      As Object
    Dim endung      As String
    Dim strKey      As String
    Dim strValue    As String
    
    Const HKEY_CLASSES_ROOT = &H80000000
    
    'Registry-Objekt anlegen
    Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
    
    endung = ".xlsx"
    
    'Key auslesen
    objReg.GetStringValue HKEY_CLASSES_ROOT, endung, "", strKey
    
    'Programmbeschreibung ausgeben
    objReg.GetStringValue HKEY_CLASSES_ROOT, strKey, "", strValue
    Debug.Print strValue
    
    'Aufruf ausgeben
    objReg.GetStringValue HKEY_CLASSES_ROOT, strKey & "\shell\Open\command", "", strValue
    Debug.Print strValue
    
    'Registry-Objekt zerstören
    Set objReg = Nothing

Ergibt
Code:
.xlsx
Microsoft Office Excel-Arbeitsblatt
"C:\Program Files\Microsoft Office\Office12\EXCEL.EXE" /e

.jpg
JPEG Image
C:\Windows\System32\rundll32.exe "C:\Program Files\Windows Photo Gallery\PhotoViewer.dll", ImageView_Fullscreen %1

.xml
Extensible Markup Language
"C:\PROGRA~1\Altova\XMLSPY~1\XMLSpy.exe" /dde
 
Zurück