Installiertes Programm suchen

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Antworten
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1403
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Installiertes Programm suchen

Beitrag von Rudolf » Sa, 14. Okt 2017 10:36

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

Benutzeravatar
HaPe
Foren-Moderator
Foren-Moderator
Beiträge: 529
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz

Re: Installiertes Programm suchen

Beitrag von HaPe » Sa, 14. Okt 2017 11:26

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
--
Hans-Peter

Organisator der XUG Stuttgart
Beisitzer des Deutschsprachige Xbase-Entwickler e. V.

DelUser01

Re: Installiertes Programm suchen

Beitrag von DelUser01 » Sa, 14. Okt 2017 13:55

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 )

Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1403
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Re: Installiertes Programm suchen

Beitrag von Rudolf » Mo, 16. Okt 2017 11:33

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

DelUser01

Re: Installiertes Programm suchen

Beitrag von DelUser01 » Mo, 16. Okt 2017 22:20

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...

Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1403
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Re: Installiertes Programm suchen

Beitrag von Rudolf » Di, 17. Okt 2017 9:27

Hallo Roland,
danke, lässt sich jetzt einbinden, aber bringt leider nichts zurück.
Grüße
Rudolf

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11417
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Installiertes Programm suchen

Beitrag von AUGE_OHR » Di, 17. Okt 2017 9:44

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:36
Ich 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 ... :-"
gruss by OHR
Jimmy

Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1403
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Re: Installiertes Programm suchen

Beitrag von Rudolf » Di, 17. Okt 2017 9:59

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 )


Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11417
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Installiertes Programm suchen

Beitrag von AUGE_OHR » Di, 17. Okt 2017 19:19

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.
gruss by OHR
Jimmy

Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1403
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Re: Installiertes Programm suchen

Beitrag von Rudolf » Mi, 18. Okt 2017 8:21

Hallo Jimmy,
funktioniert leider auch nicht
Grüße Rudolf
Dateianhänge
2017-10-18_08h19_28.png
2017-10-18_08h19_28.png (12.55 KiB) 969 mal betrachtet
2017-10-18_08h18_00.png
2017-10-18_08h18_00.png (12.03 KiB) 969 mal betrachtet

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11417
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Installiertes Programm suchen

Beitrag von AUGE_OHR » Mi, 18. Okt 2017 8:53

Rudolf hat geschrieben:
Mi, 18. Okt 2017 8:21
funktioniert 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:
gruss by OHR
Jimmy

Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1403
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Re: Installiertes Programm suchen

Beitrag von Rudolf » Mi, 18. Okt 2017 9:45

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

Antworten