Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema Image
BildScreenshot zu Image Image-Seite mit Beispielarbeitsmappe aufrufen

verknüpftes Programm auslesen | Herbers Excel-Forum


Betrifft: verknüpftes Programm auslesen von: Beverly
Geschrieben am: 30.01.2010 19:28:44

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?


GrußformelBeverly's Excel - Inn

  

Betrifft: AW: verknüpftes Programm auslesen von: Nepumuk
Geschrieben am: 30.01.2010 19:58:18

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


  

Betrifft: AW: verknüpftes Programm auslesen von: Beverly
Geschrieben am: 30.01.2010 20:25:30

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.


GrußformelBeverly's Excel - Inn


  

Betrifft: AW: verknüpftes Programm auslesen von: Nepumuk
Geschrieben am: 30.01.2010 20:55:11

Hallo Karin,

das kannst du nur aus der Registry auslesen. Ist da der Zugriff gewährt?

Gruß
Nepumuk


  

Betrifft: AW: verknüpftes Programm auslesen von: Beverly
Geschrieben am: 30.01.2010 21:53:13

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?


GrußformelBeverly's Excel - Inn


  

Betrifft: AW: verknüpftes Programm auslesen von: Nepumuk
Geschrieben am: 31.01.2010 01:07:19

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


  

Betrifft: AW: verknüpftes Programm auslesen von: Reinhard
Geschrieben am: 31.01.2010 10:01:35

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


  

Betrifft: AW: verknüpftes Programm auslesen von: Nepumuk
Geschrieben am: 31.01.2010 10:18:40

Hallo Reinhard,

und was wird angezeigt, wenn du das mit der Prozedur aus meiner ersten Antwort testest?

Gruß
Nepumuk


  

Betrifft: AW: verknüpftes Programm auslesen von: Reinhard
Geschrieben am: 31.01.2010 10:30:27

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


  

Betrifft: AW: verknüpftes Programm auslesen von: Beverly
Geschrieben am: 31.01.2010 10:29:26

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.



GrußformelBeverly's Excel - Inn


  

Betrifft: AW: verknüpftes Programm auslesen von: Reinhard
Geschrieben am: 31.01.2010 10:48:15

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


  

Betrifft: AW: verknüpftes Programm auslesen von: Beverly
Geschrieben am: 31.01.2010 10:54:24

sorry, habe die Frage als offen zu kennzeichnen vergessen.


GrußformelBeverly's Excel - Inn


  

Betrifft: AW: verknüpftes Programm auslesen von: Nepumuk
Geschrieben am: 31.01.2010 11:14:06

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


  

Betrifft: AW: verknüpftes Programm auslesen von: Reinhard
Geschrieben am: 31.01.2010 11:20:47

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


  

Betrifft: AW: verknüpftes Programm auslesen von: Nepumuk
Geschrieben am: 31.01.2010 11:29:36

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


  

Betrifft: AW: verknüpftes Programm auslesen von: Beverly
Geschrieben am: 31.01.2010 11:40:46

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.


GrußformelBeverly's Excel - Inn


  

Betrifft: AW: verknüpftes Programm auslesen von: Anton
Geschrieben am: 31.01.2010 11:53:38

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


  

Betrifft: AW: verknüpftes Programm auslesen von: Beverly
Geschrieben am: 31.01.2010 12:00:59

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.


GrußformelBeverly's Excel - Inn


  

Betrifft: AW: verknüpftes Programm auslesen von: Anton
Geschrieben am: 31.01.2010 12:08:49

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


  

Betrifft: AW: verknüpftes Programm auslesen von: Beverly
Geschrieben am: 31.01.2010 13:35:35

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.


GrußformelBeverly's Excel - Inn


  

Betrifft: AW: verknüpftes Programm auslesen von: Reinhard
Geschrieben am: 31.01.2010 10:27:08

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


  

Betrifft: AW: verknüpftes Programm auslesen von: Beverly
Geschrieben am: 31.01.2010 10:49:26

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.


GrußformelBeverly's Excel - Inn


  

Betrifft: AW: verknüpftes Programm auslesen von: Reinhard
Geschrieben am: 31.01.2010 11:08:28

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


  

Betrifft: Sorry, Frage noch offen o.w.T. von: Reinhard
Geschrieben am: 31.01.2010 11:09:29




  •   

    Betrifft: AW: verknüpftes Programm auslesen von: Beverly
    Geschrieben am: 31.01.2010 13:14:15

    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.


    GrußformelBeverly's Excel - Inn


      

    Betrifft: AW: verknüpftes Programm auslesen von: Josef Ehrensberger
    Geschrieben am: 31.01.2010 13:26:52

    Hallo Karin,


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



    Gruß Sepp



      

    Betrifft: AW: verknüpftes Programm auslesen von: Beverly
    Geschrieben am: 31.01.2010 14:41:02

    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.


    GrußformelBeverly's Excel - Inn


    Beiträge aus den Excel-Beispielen zum Thema "verknüpftes Programm auslesen"