Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1132to1136
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

verknüpftes Programm auslesen | Herbers Excel-Forum

verknüpftes Programm auslesen
30.01.2010 19:28:44
Beverly

Hi Helfer,
im Windows-Explorer kann ja festgelegt werden, mit welchem Programm ein bestimmter Dateityp geöffnet wird (nur als Beispiel: jpg-Dateien mit Corel-Photopaint). Gibt es eine Möglichkeit, dieses mit dem betreffenden Dateityp "verknüpfte" Programm mit Excel auszulesen und zu ermitteln, in welchem Ordner es sich befindet? Wenn ja - wie sähe der Code dafür aus?



26
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: verknüpftes Programm auslesen
30.01.2010 19:58:18
Nepumuk
Hallo Karin,
meinst du so?
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Private Declare Function FindExecutable Lib "shell32.dll" Alias "FindExecutableA" ( _
    ByVal lpFile As String, _
    ByVal lpDirectory As String, _
    ByVal lpResult As String) As Long

Private Const MAX_PATH As Long = 260

Public Sub Beispiel()
    Dim strExecutable As String
    Dim lngReturn As Long
    Dim vntReturn As Variant
    
    vntReturn = Application.GetOpenFilename(FileFilter:="Alle Dateien (*.*), *.*", _
        Title:="Datei auswählen", MultiSelect:=False)
    
    If vntReturn <> False Then
        
        strExecutable = Space(MAX_PATH)
        
        lngReturn = FindExecutable(vntReturn, vbNullString, strExecutable)
        
        If lngReturn > 32 Then
            MsgBox Left$(strExecutable, InStr(strExecutable & vbNullChar, vbNullChar) - 1)
        Else
            MsgBox "Kein verknüpftes Programm gefunden", vbExclamation, "Hinweis"
        End If
        
    End If
End Sub

Gruß
Nepumuk
Anzeige
AW: verknüpftes Programm auslesen
30.01.2010 20:25:30
Beverly
Hi Nepumuk,
vielen Dank schon mal für deine Antwort. Aber wahrscheinlich habe ich mich nicht ganz eindeutig ausgedrückt. Es ist so, dass mir nur der Dateiname bekannt ist (ich erhalte ihn aus einer anderen Prozedur), also z.B. "Bild.jpg" und somit der Dateityp ".jpg". Nun möchte ich wissen, mit welchem Programm - wie über den Windows-Explorer festgelegt - dieser Dateityp geöffnet wird und in welchem Ordner das öffnende Programm liegt. Ich hoffe, jetzt ist mein Anliegen besser verständlich.


Anzeige
AW: verknüpftes Programm auslesen
30.01.2010 20:55:11
Nepumuk
Hallo Karin,
das kannst du nur aus der Registry auslesen. Ist da der Zugriff gewährt?
Gruß
Nepumuk
AW: verknüpftes Programm auslesen
30.01.2010 21:53:13
Beverly
Hi Nepumuk,
das dachte ich mir fast, dass man das nur aus der Registry auslesen kann :(((. Naja, wenn es keine andere Möglichkeit gibt... Dann muss ich eben darauf vertrauen, dass der Zugriff auf die Registry erlaubt ist.
Wie würde der Code dann aussehen?


AW: verknüpftes Programm auslesen
31.01.2010 01:07:19
Nepumuk
Hallo Karin,
teste mal:
Option Explicit

Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" ( _
    ByVal hKey As Long, _
    ByVal lpSubKey As String, _
    ByRef phkResult As Long) As Long
Private Declare Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA" ( _
    ByVal hKey As Long, _
    ByVal dwIndex As Long, _
    ByVal lpValueName As String, _
    ByRef lpcbValueName As Long, _
    ByVal lpReserved As Long, _
    ByRef lpType As Long, _
    ByRef lpData As Any, _
    ByRef lpcbData As Long) As Long
Private Declare Function RegCloseKey Lib "advapi32.dll" ( _
    ByVal hKey As Long) As Long

Private Const HKEY_CLASSES_ROOT As Long = &H80000000
Private Const BUFFER_SIZE As Long = 255&
Private Const ERROR_NO_MORE_ITEMS As Long = 259&

Private Function Search_Linked_Program(strExtension As String) As String
    Dim lngKey As Long, lngNameLength As Long, lngKeyLength As Long
    Dim lngIndex As Long
    Dim strName As String, strKey As String, strProgram As String
    If Left$(strExtension, 1) <> "." Then strExtension = "." & strExtension
    If RegOpenKey(HKEY_CLASSES_ROOT, strExtension, lngKey) = 0 Then
        Do
            strName = Space$(BUFFER_SIZE)
            strKey = Space$(BUFFER_SIZE)
            lngNameLength = BUFFER_SIZE
            lngKeyLength = BUFFER_SIZE
            If RegEnumValue(lngKey, lngIndex, strName, lngNameLength, _
                0, ByVal 0&, ByVal strKey, lngKeyLength) = ERROR_NO_MORE_ITEMS Then Exit Do
            If lngKeyLength > 0 And lngNameLength = 0 Then
                strProgram = Left$(strKey, lngKeyLength - 1)
                Call RegCloseKey(lngKey)
                If RegOpenKey(HKEY_CLASSES_ROOT, strProgram & "\shell\open\command", lngKey) = 0 Then
                    strName = Space$(BUFFER_SIZE)
                    strKey = Space$(BUFFER_SIZE)
                    lngNameLength = BUFFER_SIZE
                    lngKeyLength = BUFFER_SIZE
                    Call RegEnumValue(lngKey, 0, strName, lngNameLength, _
                        0, ByVal 0&, ByVal strKey, lngKeyLength)
                    If lngKeyLength > 0 Then
                        Search_Linked_Program = Split(Left$(strKey, lngKeyLength - 1), Chr$(34))(1)
                    Else
                        Search_Linked_Program = "Kein verknüpftes Programm gefunden"
                    End If
                    Call RegCloseKey(lngKey)
                    Exit Do
                End If
            End If
            lngIndex = lngIndex + 1
        Loop
    Else
        Search_Linked_Program = strExtension & " nicht registriert oder kein Zugriff auf Registry"
    End If
End Function

Public Sub Test()
    MsgBox Search_Linked_Program(".jpg")
End Sub

Gruß
Nepumuk
Anzeige
AW: verknüpftes Programm auslesen
31.01.2010 10:01:35
Reinhard
Hallo Nepumuk,
ich habe es (XL2000,WinXP) so wie es da steht getestet.
Angezeigt wird:
C:\Programme\Gemeinsame Dateien\Microsoft Shared\PhotoEd\PHOTOED.EXE
aber öffne ich eine jpg-Datei im WindowsExplorer so wird sie mit Irfanview geöffnet.
C:\Programme\IrfanView\i_view32.exe
Gruß
Reinhard
AW: verknüpftes Programm auslesen
31.01.2010 10:18:40
Nepumuk
Hallo Reinhard,
und was wird angezeigt, wenn du das mit der Prozedur aus meiner ersten Antwort testest?
Gruß
Nepumuk
AW: verknüpftes Programm auslesen
31.01.2010 10:30:27
Reinhard
Hallo Nepumuk,
da wird korrekt der Pfad zu Irfanview angezeigt.
(Xl2000,WinXP)
Sorry, hatte deinen ersten Code nicht getestet, sonst hätte ich mir ja meinen Beitrag von eben an Karin gespart :-)
Gruß
Reinhard
Anzeige
AW: verknüpftes Programm auslesen
31.01.2010 10:29:26
Beverly
Hi Nepumuk,
vom Prinzip her ist das schon so etwas was ich suche und mit vielen Dateitypen funktioniert der _ Code auch. Aber bei Bilddateien läuft er auf den Fehler "Index außerhalb des gültigen Bereichs" in der Zeile

Search_Linked_Program = Split(Left$(strKey, lngKeyLength - 1), Chr$(34))(1)
Wenn ich mir strKey anzeigen lasse, wird folgendes ausgegeben (Dateityp ist mit Windows-FaxAnzeige verknüpft):
rundll32.exe C:\WINDOWS\system32\shimgvw.dll,ImageView_Fullscreen %1
Was aber noch eigenartiger ist - ändere ich im Windows-Explorer das verknüpfte Programm in Adobe Photoshop, steht trotzdem das selbe auf der Variablen. Also scheinen das unterschiedliche Dinge zu sein was in der Registry steht und was im Windows-Explorer festgelegt ist.


Anzeige
AW: verknüpftes Programm auslesen
31.01.2010 10:48:15
Reinhard
Hallo Karin,
unter Ordneroptionen, egal jetzt im Explorer oder in der Systemsteuerung, ist wohl das Gleiche habe ich jpg mit Irfanview verknüpft.
Beim Test vom Code von Nepumuk wurde aber der Pfad zum PhotoEditor angezeigt.
Nach dieser Photoed.exe habe ich in der Registry gesucht. Gefunden u.a. den Schlüssel (Standard) unter dem Reg-Pfad:
Arbeitsplatz\HKEY_Root_Classes\jpegfile\shell\open\command
Nur als Info, Ahnung was das genau bedeutet habe ich nicht :-))
Gruß
Reinhard
AW: verknüpftes Programm auslesen
31.01.2010 10:54:24
Beverly
sorry, habe die Frage als offen zu kennzeichnen vergessen.


Anzeige
AW: verknüpftes Programm auslesen
31.01.2010 11:14:06
Nepumuk
Hi ihr zwei,
Ok, ich hab da an der falschen Stelle gesucht. Das sind natürlich benutzerdefinierte Einstellungen und darum unter "current User" gespeichert. Versuchen wir es mal so:
Option Explicit

Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" ( _
    ByVal hKey As Long, _
    ByVal lpSubKey As String, _
    ByRef phkResult As Long) As Long
Private Declare Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA" ( _
    ByVal hKey As Long, _
    ByVal dwIndex As Long, _
    ByVal lpValueName As String, _
    ByRef lpcbValueName As Long, _
    ByVal lpReserved As Long, _
    ByRef lpType As Long, _
    ByRef lpData As Any, _
    ByRef lpcbData As Long) As Long
Private Declare Function RegCloseKey Lib "advapi32.dll" ( _
    ByVal hKey As Long) As Long

Private Const HKEY_CLASSES_ROOT As Long = &H80000000
Private Const HKEY_CURRENT_USER As Long = &H80000001
Private Const BUFFER_SIZE As Long = 255&
Private Const ERROR_NO_MORE_ITEMS As Long = 259&

Private Function Search_Linked_Program(strExtension As String) As String
    Dim lngKey As Long, lngNameLength As Long, lngKeyLength As Long
    Dim lngIndex As Long
    Dim strName As String, strKey As String, strProgram As String
    If Left$(strExtension, 1) <> "." Then strExtension = "." & strExtension
    If RegOpenKey(HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\" & _
        "Explorer\FileExts\" & strExtension & "\UserChoice", lngKey) = 0 Then
        Do
            strName = Space$(BUFFER_SIZE)
            strKey = Space$(BUFFER_SIZE)
            lngNameLength = BUFFER_SIZE
            lngKeyLength = BUFFER_SIZE
            If RegEnumValue(lngKey, lngIndex, strName, lngNameLength, _
                0, ByVal 0&, ByVal strKey, lngKeyLength) = ERROR_NO_MORE_ITEMS Then Exit Do
            If lngKeyLength > 0 Then
                If Left$(strName, lngNameLength) = "Progid" Then
                    strProgram = Left$(strKey, lngKeyLength - 1)
                    Call RegCloseKey(lngKey)
                    If RegOpenKey(HKEY_CLASSES_ROOT, strProgram & "\shell\open\command", lngKey) = 0 Then
                        strName = Space$(BUFFER_SIZE)
                        strKey = Space$(BUFFER_SIZE)
                        lngNameLength = BUFFER_SIZE
                        lngKeyLength = BUFFER_SIZE
                        Call RegEnumValue(lngKey, 0, strName, lngNameLength, _
                            0, ByVal 0&, ByVal strKey, lngKeyLength)
                        If lngKeyLength > 0 Then
                            strKey = Left$(strKey, lngKeyLength - 1)
                            If Cbool(InStr(1, strKey, Chr$(34))) Then
                                Search_Linked_Program = Split(strKey, Chr$(34))(1)
                            Else
                                Search_Linked_Program = Split(Split(strKey, " ")(1), ",")(0)
                            End If
                        Else
                            Search_Linked_Program = "Kein verknüpftes Programm gefunden"
                        End If
                        Call RegCloseKey(lngKey)
                        Exit Do
                    End If
                End If
            End If
            lngIndex = lngIndex + 1
        Loop
    Else
        Search_Linked_Program = strExtension & " nicht registriert oder kein Zugriff auf Registry"
    End If
End Function

Public Sub Test()
    MsgBox Search_Linked_Program(".xls")
End Sub

Gruß
Nepumuk
Anzeige
AW: verknüpftes Programm auslesen
31.01.2010 11:20:47
Reinhard
Hallo Nepumuk,
Public Sub Test()
MsgBox Search_Linked_Program(".jpg")
End Sub
Da kommt leider bei mir:
.jpg nicht registriert oder kein Zugriff auf Registry
PS: Regedit habe ich schon lange wieder beendet, das kanns nicht sein *glaub*
Gruß
Reinhard
AW: verknüpftes Programm auslesen
31.01.2010 11:29:36
Nepumuk
Hallo Reinhard,
Registry ist eine heikle Sache, die ist von Version zu Version ein bisschen unterschiedlich. Bei mir unter Vista funktioniert das nämlich. Wenn das auf allen Rechnern funktionieren soll, dann brauche ich noch 5 Computer mit den unterschiedlichen Betriebssystemen.
Ich frag mich langsam auch, wozu man/frau die Verknüpfung zu einer nicht existierenden Datei benötigt???
Gruß
Nepumuk
Anzeige
AW: verknüpftes Programm auslesen
31.01.2010 11:40:46
Beverly
Hi Nepumuk,
bei mir kommt der Hinweis bei jedem Dateiyp - ich verwende Win XP, habe Admin-Rechte. Also lassen wir das mit der Registry.
Deine Frage ist ganz einfach zu beantworten: es gibt bekanntlich in ein Tabellenblatt eingebettete Dateien, die man folglich nicht auf der Festplatte suchen kann.


AW: verknüpftes Programm auslesen
31.01.2010 11:53:38
Anton
Hallo @all,
vllt so?:
Code:
Option Explicit
Private Declare Function FindExecutable Lib "shell32.dll" Alias "FindExecutableA" ( _  
  ByVal lpFile As String, _  
  ByVal lpDirectory As String, _  
  ByVal lpResult As String) As Long    
Private Const MAX_PATH As Long = 260    
Public Sub Beispiel()  
  Dim strExecutable As String  
  Dim lngReturn As Long  
  Dim vntReturn As Variant  
  Dim ff As Integer    
  vntReturn = ThisWorkbook.Path & "\test.jpg"
  ff = FreeFile
  Open vntReturn For Output As #ff    
  Print #ff, vbNullString  
  Close #ff
  strExecutable = Space(MAX_PATH)
  lngReturn = FindExecutable(vntReturn, vbNullString, strExecutable)
  If lngReturn > 32 Then  
    MsgBox Left$(strExecutable, InStr(strExecutable & vbNullChar, vbNullChar) - 1)
  Else
    MsgBox "Kein verknüpftes Programm gefunden", vbExclamation, "Hinweis"
  End If  
  Kill vntReturn
End Sub  


mfg Anton
Anzeige
AW: verknüpftes Programm auslesen
31.01.2010 12:00:59
Beverly
Hi Anton,
das ist vom Prinzip her ein ähnlicher Code wie der, den Nepumuk als erstes gepostet hatte und auch wie der Code von Reinhard - da die Datei jedoch nicht auf der Festplatte liegt fehlt der Pfad, der hierbei erforderlich ist.


AW: verknüpftes Programm auslesen
31.01.2010 12:08:49
Anton
Hallo Karin,
ist vom Prinzip her ein ähnlicher Code 

Da hast du recht , nur es wird eine Datei in einem bekannten (ThisWorkbook.Path) Pfad erstellt und darauf greift die Funktion FindExecutable zu.
mfg Anton
AW: verknüpftes Programm auslesen
31.01.2010 13:35:35
Beverly
Hi Anton,
sorry, dass ich deinen Code nicht getestet hatte - er scheint die Lösung sein. Auf jeden Fall funktioniert das Ganze schon mal und scheint auch logisch zu sein - da die Datei (für die ich das verknüpfte Programm suche) nicht auf dem Rechner vorhanden ist, wird ein "Fake" vom selben Dateityp erstellt und dafür die Programmverknüpfung ermittelt: ich würde sagen - genial. Vielen Dank.


AW: verknüpftes Programm auslesen
31.01.2010 10:27:08
Reinhard
Hallo Karin.
ich fand VB-Code auf der Seite:
http://www.vb-fun.de/cgi-bin/loadframe.pl?ID=vb/tipps/tip0165.shtml
und habe den umgebastelt. Leider muß man auch den Ordner angeben.
Aber das ist ja prinzipiell nur mehr Aufwand mal kurz auf der gesamten Festplatte nach der ersten Datei suchen die die gesuchte Endung hat, dann hat man ja einen Dateinamen und einen Pfad.
Und diesmal wurde bei mir korrekt Irfanview als verknüpftes Programm erkannt.
Option Explicit
Private Declare Function FindExecutable Lib "shell32.dll" Alias _
"FindExecutableA" (ByVal lpFile As String, ByVal lpDirectory _
As String, ByVal lpResult As String) As Long
Sub tt()
Dim Datei, Pfad, exe As String, result
exe = Space(254) & Chr(0)
Datei = "cpu.jpg"
Pfad = "C:\test"
result = FindExecutable(Datei, Pfad, exe)
MsgBox Left(exe, InStr(exe, Chr(0)))
End Sub

Gruß
Reinhard
AW: verknüpftes Programm auslesen
31.01.2010 10:49:26
Beverly
Hi Reinhard,
danke für deine Bemühungen. Es ist nur so, dass ich den Pfad nicht kenne, im dem die Datei gespeichert ist sondern nur den Dateinamen und somit den Dateityp. Ich müsste dann ja alle Festplatten durchsuchen, bis ich eine beliebige Datei dieses Dateityps gefunden habe. Das würde dann viel zu lange dauern.


AW: verknüpftes Programm auslesen
31.01.2010 11:08:28
Reinhard
Hallo Karin,
okay, VBA wird, wenn es eine Lösung gibt Nepumuk diese schon finden, ich weniger :-))
Mal ein anderer Ansatz der dir vielleicht zu anderen Wegen verhilft.
Kennst du regmon.exe und filemon.exe? Die beobachten was wo in die Registry geschrieben wird bzw. alle Arten von Dateizugriffen.
Schau bitte mal hier, anscheinend hat MS rtwas Neues anstelle von ihnen:
http://www.heise.de/newsticker/meldung/Aus-fuer-die-Sysinternals-Tools-Regmon-und-Filemon-7473.html
Das neue kenne ich nicht. Ich kann dir nur dein Vorgehen bei den beiden "alten" beschreiben.
Gehe in Ordneroptionen und bereite alles vor daß du schnell einem bestimmten Dateityp ein anderes Programm zuweisen kannst.
Dann muß es sehr schnell gehen, z.B. regmon.exe starten, sofort das Programm dem Dateityp zuweisen, regmon stoppen.
Die Schnelligkeit hat seinen Grund einzig darin daß SEHR VIEL aufgezeichnet wird.
Nach dem Stopp haste Zeit und Ruhe um die Aufzeichnung auszuwerten.
Vielleicht erhälst du dadurch genaue Erkenntnisse wo Windows was abspeichert.
Beide Programme sind Freeware von MS.
Gruß
Reinhard
Sorry, Frage noch offen o.w.T.
31.01.2010 11:09:29
Reinhard

  • AW: verknüpftes Programm auslesen
    31.01.2010 13:14:15
    Beverly
    Hi Reinhard,
    ich kenne diese Programme nicht, habe aber schon davon gehört. Wenn ich das richtig verstehe zeichnen sie die Veränderungen der Registry auf - da die Registrierung der verknüpften Programme aber offensichtlich bei jedem Betriebssystem an einer anderen Stelle geschieht, bringt das leider nicht viel, da ich es ja nur mit meinem Betriebssystem testen kann.


    AW: verknüpftes Programm auslesen
    31.01.2010 13:26:52
    Josef Ehrensberger
    Hallo Karin,

    um bei Nepumuks Frage zu bleiben, wozu brauchst du das, bzw. was willst du damit erreichen?

    Gruß Sepp
    AW: verknüpftes Programm auslesen
    31.01.2010 14:41:02
    Beverly
    Hi Sepp,
    für eine eingebettete Datei benötige ich das verknüpfte Programm, um es im weiteren Code dann ansprechen zu können - man soll das Programm aus Excel wieder schließen können. Mir fehlte dazu bisher noch die Möglichkeit, das Programm zu ermitteln, mit dem die Datei durch das System geöffnet wird. Meine bisherigen Versuche sind da immer fehlgeschlagen, aber Dank Anton dürfte dieses Problem jetzt gelöst sein.


    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige