Seite 1 von 1

Installiertes Programm suchen

Verfasst: Sa, 14. Okt 2017 10:36
von Rudolf
Hallo,
weiss jemand wie ich in Windows die Details zu einem installierten Programm finde ? Ich brauche den Programmpfad dafür, den Programmnamen habe ich. Eine Suche nach dem Namen würde zu lange dauern.
Grüße
Rudolf

Re: Installiertes Programm suchen

Verfasst: Sa, 14. Okt 2017 11:26
von HaPe
Hallo Rudolf !
weiss jemand wie ich in Windows die Details zu einem installierten Programm finde ?
Ich weiß jetzt nicht ob dir das hilft, aber FindExecutable liefert dir den Namen und das Verzeichnis des Programmes das in Windows für ein bestimmtes Dokument registriert ist:
https://msdn.microsoft.com/de-de/librar ... s.85).aspx

Re: Installiertes Programm suchen

Verfasst: Sa, 14. Okt 2017 13:55
von DelUser01
Hallo Rudolf

ich mache das über die Registry - in mehreren Stufen - try and error... :-)

Code: Alles auswählen

Function GsApiRegGetExe( cProgName , cDatei )

Local nPos
Local cRet := ""
Local cExt := ""

If Empty( cRet )
   cRet := GsApiRegGetPrg( cProgName , 1 )
EndIf

If Empty( cRet )
   cRet := GsApiRegGetPrg( cProgName , 2 )
EndIf

If Empty( cRet )
   cRet := GsApiRegGetPrg( cProgName , 3 )
EndIf

If Empty( cRet )
   If ! Empty( cDatei )

      nPos := At( "://" , cDatei )

      If nPos > 0
         cExt := Left( cDatei , nPos - 1 )
      Else
         cExt := GsConvFile( cDatei , "E" )
      EndIf

      If ! Empty( cDatei )
         cRet := GsApiRegGetApp( "." + cExt )
      EndIf

   EndIf
EndIf

Return( cRet )
/*----------------------------------------------------------------------------*/
Function GsApiRegGetPrg( cProgName , nStep )

Local cRet
Local aReg := { 0 , "" , "" }     //  { HKey , Key , Entry }

cProgName := Upper( cProgName )

If cProgName == "EXPLORER" .Or. cProgName == "DIRECTORY"
   aReg := { HKEY_CLASSES_ROOT  , "Directory\shell\find\Command" , "" }
ElseIf nStep == 1
   aReg := { HKEY_CLASSES_ROOT  , "Applications\" + cProgName + ".exe\shell\Open\Command" , "" }
ElseIf nStep == 2
   aReg := { HKEY_LOCAL_MACHINE , "SOFTWARE\Microsoft\windows\CurrentVersion\App Paths\" + cProgName + ".exe" , "" }
ElseIf nStep == 3
   aReg := { HKEY_CLASSES_ROOT  , cProgName + "\shell\Open\Command" , "" }
EndIf

cRet := GsApiQueryRegistryA( aReg )

Return( cRet )
/*----------------------------------------------------------------------------*/
Function GsApiRegGetApp( cExt )

Local cRet
Local aReg := { 0 , "" , "" }               //  { HKey , Key , Entry }

cExt := AllTrim( Upper( cExt ) )
aReg := {  HKEY_CLASSES_ROOT , cExt , "" }
cRet := GsApiQueryRegistryA( aReg )

If ! Empty( cRet )
   aReg := {  HKEY_CLASSES_ROOT , cRet + "\shell\open\command" , "" }
   cRet := GsApiQueryRegistryA( aReg )
EndIf

Return( cRet )
/*----------------------------------------------------------------------------*/
Function GsApiQueryRegistryA( aReg )

Local cName := GsApiQueryRegistry( aReg[1] , aReg[2] , aReg[3] )

Return( cName )
/*----------------------------------------------------------------------------*/
Function GsApiQueryRegistry( nHKEY , cKey , cEntry )

Local cName  := ""                           // Alle Parameter, die an
Local nSize  := 0                            // API Funktionen übergeben
Local nHandle:= 0                            // werden, müssen einen Wert
Local nType  := 0                            // ungleich NIL haben
Local nRet   := 0
Local nDll   := 0

nDll := MainDllLoad( "ADVAPI32.DLL" )

IF nDll <> 0

   nRet := RegOpenKeyExA( nHKEY , cKey , 0 , KEY_QUERY_VALUE , @nHandle )   // Registry öffnen

   If nRet == 0                               // Fehler beim öffnen (<>0)
      // L„nge und Typ des Eintrags feststellen
      RegQueryValueExA( nHandle , cEntry , 0 , @nType , @cName , @nSize )
      If nSize > 0
         cName := Space( nSize - 1 )         // Leeren String vorbereiten. Er wird per Referenz an die
         // API übergeben und enthält dann das Ergebnis.
         RegQueryValueExA( nHandle , cEntry , 0 , nType , @cName , @nSize )
      EndIf
   EndIf

   RegCloseKey( nHandle )                    // Registry schließen
   MainDllUnLoad( nDll )

EndIf

Return( cName )

Re: Installiertes Programm suchen

Verfasst: Mo, 16. Okt 2017 11:33
von Rudolf
Hallo,
danke für die Antworten, leider weiss ich nicht wie ich die API FUnktion nutzen kann, und bei der Funktion von Roland fehlen mir ein paar Funktionen wie MainDllLoad, MainDllUnLoad etc.

Grüße
Rudolf

Re: Installiertes Programm suchen

Verfasst: Mo, 16. Okt 2017 22:20
von DelUser01
Hallo Rudolf

Code: Alles auswählen

#define HKEY_CLASSES_ROOT     2147483648
#define HKEY_CURRENT_USER     2147483649
#define HKEY_LOCAL_MACHINE    2147483650
#define HKEY_USERS            2147483651

Code: Alles auswählen

aus
nDll := MainDllLoad( "ADVAPI32.DLL" )
mache
nDll := DllLoad( "ADVAPI32.DLL" )

Code: Alles auswählen

aus
MainDllUnLoad( nDll )
mache
DllUnLoad( nDll )

Code: Alles auswählen

diese Funktion
cExt := GsConvFile( cDatei , "E" )
extrahiert die Dateierweiterung aus cDatei
z.B.:
cDatei := "c:\test.exe"
cExt := "exe"

Code: Alles auswählen

DllFunction RegOpenKeyExA( nHkeyClass , cKeyName , nReserved , nAccess , @nKeyHandle ) ;
            Using STDCALL ;
            From ADVAPI32.DLL

DllFunction RegQueryValueExA(nKeyHandle,cEntry,nReserved,@nType,@cName,@nSize) ;
            Using STDCALL ;
            From ADVAPI32.DLL

DllFunction RegCloseKey(nKeyHandle) ;
            Using STDCALL ;
            From ADVAPI32.DLL
Mag sein dass ich noch was vergessen habe - einfach melden...

Re: Installiertes Programm suchen

Verfasst: Di, 17. Okt 2017 9:27
von Rudolf
Hallo Roland,
danke, lässt sich jetzt einbinden, aber bringt leider nichts zurück.
Grüße
Rudolf

Re: Installiertes Programm suchen

Verfasst: Di, 17. Okt 2017 9:44
von AUGE_OHR
Rudolf hat geschrieben: Sa, 14. Okt 2017 10:36 weiss jemand wie ich in Windows die Details zu einem installierten Programm finde ?
hat das Teil ein Icon angelegt ? wenn ja ShellLinkResolve()
Rudolf hat geschrieben: Sa, 14. Okt 2017 10:36Ich brauche den Programmpfad dafür, den Programmnamen habe ich. Eine Suche nach dem Namen würde zu lange dauern.
Everything -> sucht in einer eigenen Datenbank welche direkt aus dem NTFS "gespeist" wird und findet alles in < 1 Sec :!:
arbeitet jetzt auch zusammen mit Total Commander und gibt es als SDK / API mit man was für Xbase++ bauen könnte ... :-"

Re: Installiertes Programm suchen

Verfasst: Di, 17. Okt 2017 9:59
von Rudolf
Hallo Jimmy,
ja, hat ein Icon, mit wildfindwindow findet er es (läuft immer im Hintergrund), aber hier bekomme ich keinen Pfad sondern nur einen handle.
Grüße
Rudolf

das ist jetzt mein Code:

Code: Alles auswählen

#define HKEY_CLASSES_ROOT     2147483648
#define HKEY_CURRENT_USER     2147483649
#define HKEY_LOCAL_MACHINE    2147483650
#define HKEY_USERS            2147483651


DllFunction RegOpenKeyExA( nHkeyClass , cKeyName , nReserved , nAccess , @nKeyHandle ) ;
            Using STDCALL ;
            From ADVAPI32.DLL

DllFunction RegQueryValueExA(nKeyHandle,cEntry,nReserved,@nType,@cName,@nSize) ;
            Using STDCALL ;
            From ADVAPI32.DLL

DllFunction RegCloseKey(nKeyHandle) ;
            Using STDCALL ;
            From ADVAPI32.DLL

Function GsApiRegGetExe( cProgName , cDatei )
******************************************************************
Local nPos
Local cRet := ""
Local cExt := ""

If Empty( cRet )
   cRet := GsApiRegGetPrg( cProgName , 1 )
EndIf

If Empty( cRet )
   cRet := GsApiRegGetPrg( cProgName , 2 )
EndIf

If Empty( cRet )
   cRet := GsApiRegGetPrg( cProgName , 3 )
EndIf

If Empty( cRet )
   If ! Empty( cDatei )

      nPos := At( "://" , cDatei )

      If nPos > 0
         cExt := Left( cDatei , nPos - 1 )
      Else
         cExt := token( cDatei , "." )
      EndIf

      If ! Empty( cDatei )
         cRet := GsApiRegGetApp( "." + cExt )
      EndIf

   EndIf
EndIf

Return( cRet )
/*----------------------------------------------------------------------------*/
Function GsApiRegGetPrg( cProgName , nStep )

Local cRet
Local aReg := { 0 , "" , "" }     //  { HKey , Key , Entry }

cProgName := Upper( cProgName )

If cProgName == "EXPLORER" .Or. cProgName == "DIRECTORY"
   aReg := { HKEY_CLASSES_ROOT  , "Directory\shell\find\Command" , "" }
ElseIf nStep == 1
   aReg := { HKEY_CLASSES_ROOT  , "Applications\" + cProgName + ".exe\shell\Open\Command" , "" }
ElseIf nStep == 2
   aReg := { HKEY_LOCAL_MACHINE , "SOFTWARE\Microsoft\windows\CurrentVersion\App Paths\" + cProgName + ".exe" , "" }
ElseIf nStep == 3
   aReg := { HKEY_CLASSES_ROOT  , cProgName + "\shell\Open\Command" , "" }
EndIf

cRet := GsApiQueryRegistryA( aReg )

Return( cRet )
/*----------------------------------------------------------------------------*/
Function GsApiRegGetApp( cExt )

Local cRet
Local aReg := { 0 , "" , "" }               //  { HKey , Key , Entry }

cExt := AllTrim( Upper( cExt ) )
aReg := {  HKEY_CLASSES_ROOT , cExt , "" }
cRet := GsApiQueryRegistryA( aReg )

If ! Empty( cRet )
   aReg := {  HKEY_CLASSES_ROOT , cRet + "\shell\open\command" , "" }
   cRet := GsApiQueryRegistryA( aReg )
EndIf

Return( cRet )
/*----------------------------------------------------------------------------*/
Function GsApiQueryRegistryA( aReg )

Local cName := GsApiQueryRegistry( aReg[1] , aReg[2] , aReg[3] )

Return( cName )
/*----------------------------------------------------------------------------*/
Function GsApiQueryRegistry( nHKEY , cKey , cEntry )

Local cName  := ""                           // Alle Parameter, die an
Local nSize  := 0                            // API Funktionen übergeben
Local nHandle:= 0                            // werden, müssen einen Wert
Local nType  := 0                            // ungleich NIL haben
Local nRet   := 0
Local nDll   := 0

nDll := DllLoad( "ADVAPI32.DLL" )

IF nDll <> 0

   nRet := RegOpenKeyExA( nHKEY , cKey , 0 , KEY_QUERY_VALUE , @nHandle )   // Registry öffnen

   If nRet == 0                               // Fehler beim öffnen (<>0)
      // L„nge und Typ des Eintrags feststellen
      RegQueryValueExA( nHandle , cEntry , 0 , @nType , @cName , @nSize )
      If nSize > 0
         cName := Space( nSize - 1 )         // Leeren String vorbereiten. Er wird per Referenz an die
         // API übergeben und enthält dann das Ergebnis.
         RegQueryValueExA( nHandle , cEntry , 0 , nType , @cName , @nSize )
      EndIf
   EndIf

   RegCloseKey( nHandle )                    // Registry schließen
   DllUnLoad( nDll )

EndIf

Return( cName )


Re: Installiertes Programm suchen

Verfasst: Di, 17. Okt 2017 19:19
von AUGE_OHR
Rudolf hat geschrieben: Di, 17. Okt 2017 9:59 ja, hat ein Icon, mit wildfindwindow findet er es (läuft immer im Hintergrund), aber hier bekomme ich keinen Pfad sondern nur einen handle.
ist sprach von der Xbase++ Function ShellLinkResolve() ... nicht von der Registry.

Re: Installiertes Programm suchen

Verfasst: Mi, 18. Okt 2017 8:21
von Rudolf
Hallo Jimmy,
funktioniert leider auch nicht
Grüße Rudolf

Re: Installiertes Programm suchen

Verfasst: Mi, 18. Okt 2017 8:53
von AUGE_OHR
Rudolf hat geschrieben: Mi, 18. Okt 2017 8:21funktioniert leider auch nicht
ShellLinkResolve() ist das Gegenstück zu ShellLinkCreate() mit dem man einen LINK anlegt :!:
ShellLinkResolve() gibt dir zu einem LINK aus was damit ausgeführt wird [-o<
Syntax

ShellLinkResolve( <cLinkFile> ) --> <cLinkTarget>

Parameter

<cLinkFile>

Eine Zeichenkette mit dem Dateinamen der Verknüpfung. Befindet sich die Verknüpfung nicht im aktuellen Verzeichnis, muß <cLinkFile> als vollständig qualifizierter Pfad angegeben sein.
also versuche es mal richtig mit *.LNK File :boxing:

Re: Installiertes Programm suchen

Verfasst: Mi, 18. Okt 2017 9:45
von Rudolf
Hallo Jimmy, aber dann muss ich das Desktop Verzeichnis und das File für den Link vorher suchen, ich werde einfach die Programmverzeichnisse nach der Exe durchsuchen, der Zeitaufwand ist vernachlässigbar. Wenn dort nicht gefunden, muss der User es eben manuell eingeben, wird aber kaum vorkommen denke ich.
Grüße
Rudolf