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
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
ShellLink
Resolve() ist das Gegenstück zu ShellLink
Create() mit dem man einen LINK
anlegt
ShellLink
Resolve() gibt dir zu einem LINK aus was damit
ausgeführt wird
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
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