tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von Zvoni
ERLEDIGT
JA
ANTWORTEN
14
ZUGRIFFE
960
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    DrMueller DrMueller ist offline Mitglied Brokat
    Registriert seit
    Aug 2006
    Beiträge
    396
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    
    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
     

  2. #2
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    Microsoft stellt ein Code-Schnipsel zur Verfügung um eine Datei mit dem dazugehörigen regisitrierten Programm zu öffnen.
    Aus Visual Basic heraus Dokumente in zugehörigen Anwendungen öffnen
     
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  3. #3
    DrMueller DrMueller ist offline Mitglied Brokat
    Registriert seit
    Aug 2006
    Beiträge
    396
    Ich will nicht direkt öffnen, ich muss nur wissen, mit welchem Programm die Datei standardmässig geöffnet werden soll.
     

  4. #4
    Zvoni Zvoni ist offline Mitglied Platin
    Registriert seit
    Jul 2008
    Ort
    Hinter dem Mond gleich links
    Beiträge
    735
    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]
     
    Zwei Dinge sind unendlich: Die menschliche Dummheit und das Universum, nur bei letzterem bin ich mir noch nicht sicher. - Albert Einstein

    Code vb:
    1
    
    If Beitrag.Hilfreich=True Then Bewertung.Send("Positiv")

  5. #5
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    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
     
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  6. #6
    Zvoni Zvoni ist offline Mitglied Platin
    Registriert seit
    Jul 2008
    Ort
    Hinter dem Mond gleich links
    Beiträge
    735
    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"
     
    Zwei Dinge sind unendlich: Die menschliche Dummheit und das Universum, nur bei letzterem bin ich mir noch nicht sicher. - Albert Einstein

    Code vb:
    1
    
    If Beitrag.Hilfreich=True Then Bewertung.Send("Positiv")

  7. #7
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    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.

    Code vb:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    
        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
     
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  8. #8
    Zvoni Zvoni ist offline Mitglied Platin
    Registriert seit
    Jul 2008
    Ort
    Hinter dem Mond gleich links
    Beiträge
    735
    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.
    Yaslaw bedankt sich. 
    Zwei Dinge sind unendlich: Die menschliche Dummheit und das Universum, nur bei letzterem bin ich mir noch nicht sicher. - Albert Einstein

    Code vb:
    1
    
    If Beitrag.Hilfreich=True Then Bewertung.Send("Positiv")

  9. #9
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    Das machts ja noch viel einfacher *g*

    Code vb:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    
        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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    .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
     
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  10. #10
    Zvoni Zvoni ist offline Mitglied Platin
    Registriert seit
    Jul 2008
    Ort
    Hinter dem Mond gleich links
    Beiträge
    735
    Ist es das, was du gesucht hast?
     
    Zwei Dinge sind unendlich: Die menschliche Dummheit und das Universum, nur bei letzterem bin ich mir noch nicht sicher. - Albert Einstein

    Code vb:
    1
    
    If Beitrag.Hilfreich=True Then Bewertung.Send("Positiv")

  11. #11
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    Zitat Zitat von Zvoni Beitrag anzeigen
    Ist es das, was du gesucht hast?
    Das ist das, was ich denke, das DrMueller gesucht hat *g*
     
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  12. #12
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    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.

    [VB] File Informationen

    Und zwar gehts um die 2 folgenden Funktionen
    Code vb:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    
    '/**
    ' * 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
     
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  13. #13
    Zvoni Zvoni ist offline Mitglied Platin
    Registriert seit
    Jul 2008
    Ort
    Hinter dem Mond gleich links
    Beiträge
    735
    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?
     
    Zwei Dinge sind unendlich: Die menschliche Dummheit und das Universum, nur bei letzterem bin ich mir noch nicht sicher. - Albert Einstein

    Code vb:
    1
    
    If Beitrag.Hilfreich=True Then Bewertung.Send("Positiv")

  14. #14
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    Ein Link? Jepp.
    Zitat Zitat von Yaslaw Beitrag anzeigen

    Das mit Bindungen zur Laufzeit - ich arbeite nicht gerne mit den API wenn ich etwas nicht häufig brauche. Hab da immer schnell ein Durcheinander welche Definitionen ich jetzt nach meinen Tests wirklich noch brauche.
     
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  15. #15
    DrMueller DrMueller ist offline Mitglied Brokat
    Registriert seit
    Aug 2006
    Beiträge
    396
    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.
     

Ähnliche Themen

  1. Access 2000 / 2003; Datei mit externem Standardprogramm öffnen
    Von jeipack im Forum Office-Anwendungen
    Antworten: 0
    Letzter Beitrag: 14.04.10, 15:02
  2. Standardprogramm für Dateien rausfinden
    Von TestIT im Forum .NET Café
    Antworten: 2
    Letzter Beitrag: 25.09.09, 12:59
  3. Standardprogramm für Dateitypen (PDF)
    Von jeipack im Forum Java
    Antworten: 4
    Letzter Beitrag: 27.03.07, 14:41
  4. Standardprogramm für Dateitypen
    Von broetchen im Forum .NET Archiv
    Antworten: 1
    Letzter Beitrag: 22.11.04, 11:58
  5. Datein mit entsprechendem Standardprogramm öffnen
    Von EriFo im Forum VisualStudio & MFC
    Antworten: 1
    Letzter Beitrag: 03.07.04, 21:33