![]() |
Liste aller installierten Programme
Ich möchte in der Registry (HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Cur rentVersion\App Paths) allen installierte Programme
auflisten.Habe folgenden Code gefunden.Das Memofeld bleibt aber leer.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var AppInfo: String; TempStrings: TStringList; I: Integer; begin TempStrings := TStringList.Create; Memo1.Lines.Clear; AppInfo := ''; with TRegistry.Create do begin RootKey := HKEY_LOCAL_MACHINE; OpenKey('\Software\Microsoft\Windows\CurrentVersion\App Paths', True); //Open specific key... GetKeyNames(TempStrings); CloseKey; for I := 0 to TempStrings.Count - 1 do begin OpenKey('\Software\Microsoft\Windows\CurrentVersion\App Paths\' + TempStrings[I], True); AppInfo := 'File path: ' + ReadString('') + #13#10; if ValueExists('Path') then AppInfo := AppInfo + 'Path: ' + ReadString('Path') + #13#10; if ValueExists('Version') then AppInfo := AppInfo + 'Version: ' + ReadString('Version') + #13#10; AppInfo := AppInfo + '--------------------------------------'; Memo1.Lines.Add(AppInfo); CloseKey; end; Free; end; TempStrings.Free; end; |
AW: Liste aller installierten Programme
Welches Betriebssystem? Der Konstruktor der Klasse TRegistry öffnet den Schlüssel immermit allen Rechten, also auch Schreibrechten. Als einfacher Benutzer hat man aber im Hive HKLM keine Schreibrechte, weswegen das Memo wohl leer beleibt. Gäbe es eine gescheite Fehlerbehandlung, wäre das wahrscheinlich auch aufgefallen. Ich hoffe du hast den Code nicht bei uns im Forum gefunden.
|
AW: Liste aller installierten Programme
Den (Lese)Zugriff auf die Registry starten mit der Anweisung:
Code:
{..}
with TRegistry.Create(KEY_READ) do {...} |
AW: Liste aller installierten Programme
Dein Code ist ok.
Ich habe XP und D7 im Einsatz... |
AW: Liste aller installierten Programme
Und arbeitest als Admin oder normaler Benutzer?
Ab Vista mit aktiver UAC arbeitet aber auch ein Adminbenutzer standradmässig nur mit Benutzerrechten. |
AW: Liste aller installierten Programme
Win 7 // D7 // o.k.
|
AW: Liste aller installierten Programme
Oder so etwas ?
Delphi-Quellcode:
function GetWinAppInstallInfo(outStrings: TStrings): bool;
const REG_APPPATHS = '\Software\Microsoft\Windows\CurrentVersion\Uninstall'; var AppInfo: string; strLst: TStringList; i: Integer; begin Result := False; if ASSIGNED(outStrings) then begin with TRegistry.Create(KEY_READ) do try RootKey := HKEY_LOCAL_MACHINE; strLst := TStringList.Create; try if OpenKey(REG_APPPATHS, False) then begin GetKeyNames(strLst); CloseKey; for I := 0 to strLst.Count - 1 do begin outStrings.Add(format('Application: %s', [strLst[I]])); if OpenKey(REG_APPPATHS + '\' + strLst[I], False) then begin AppInfo := #9'Location:'; if ValueExists('InstallLocation') then AppInfo := AppInfo + #9#9 + ReadString('InstallLocation') + #13#10 else AppInfo := AppInfo + #9#9'(System)' + #13#10; if ValueExists('Displayname') then AppInfo := AppInfo + #9'Displayname: ' + #9 + ReadString('Displayname') + #13#10; outStrings.Add(AppInfo); CloseKey; Result := True; end; end; //for end else begin // Error read end; finally strLst.Free; end; finally Free; // Registry end; end else ShowMessage('Zonk "outStrings" !'); end; procedure TForm1.FormCreate(Sender: TObject); begin Memo1.Clear; GetWinAppInstallInfo(Memo1.Lines); end; |
AW: Liste aller installierten Programme
Den Code könnte man bezüglich der Fehlerbehandlung noch etwas optimieren. Ich würde zum Beispiel eine Exception werfen und nicht mit Rückgabewerten arbeiten.
|
AW: Liste aller installierten Programme
Danke der Tipp mit TRegistry.Create(key_read) war erfolgreich.
|
AW: Liste aller installierten Programme
Der Quelltext aus Beitrag #7 liefert (unter Delphi) falsche Ergebnisse.
Reine 64bit Anwendungen, welche durch einen 64bit Installer installiert wurden werden nicht gelistet! |
AW: Liste aller installierten Programme
Weil du mit einer 32-Bit Anwendung nicht auf den Registryschlüssel zugreifen kannst. Man kann aber die Umleitung deaktivieren. Mir fällt nur nicht die entsprechende API-Funktion ein.
|
AW: Liste aller installierten Programme
Kleine Korrektur: man kann sehr wohl, und man muss dazu nichtmal die Umleitung deaktiveren. Siehe
![]() Wenn Du das nicht meintest und wir unter Umleitung verschiedenes verstehen ;) |
AW: Liste aller installierten Programme
Ok, so geht es natürlich auch.
|
AW: Liste aller installierten Programme
Zitat:
Ich kann aber noch sagen, dass es mit älteren Delpi-Versionen ein Bug gibt, wo unter Umständen das Flag nicht "ankommt" wenn mit KEY_READ bzw. anderen Rechten gelesen wird. Ich glaube betroffen waren alle Versionen vor D2007. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz