Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Liste aller installierten Programme (https://www.delphipraxis.net/161275-liste-aller-installierten-programme.html)

verkouter 26. Jun 2011 01:17

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;

Luckie 26. Jun 2011 01:25

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.

ASM 26. Jun 2011 10:09

AW: Liste aller installierten Programme
 
Den (Lese)Zugriff auf die Registry starten mit der Anweisung:
Code:
{..}
with TRegistry.Create(KEY_READ) do
{...}

skh 26. Jun 2011 10:09

AW: Liste aller installierten Programme
 
Dein Code ist ok.
Ich habe XP und D7 im Einsatz...

mkinzler 26. Jun 2011 10:27

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.

markus5766h 26. Jun 2011 10:44

AW: Liste aller installierten Programme
 
Win 7 // D7 // o.k.

turboPASCAL 26. Jun 2011 11:56

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;

Luckie 26. Jun 2011 11:59

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.

verkouter 26. Jun 2011 13:49

AW: Liste aller installierten Programme
 
Danke der Tipp mit TRegistry.Create(key_read) war erfolgreich.

generic 26. Jun 2011 22:58

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!

Luckie 27. Jun 2011 00:09

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.

CCRDude 27. Jun 2011 09:46

AW: Liste aller installierten Programme
 
Kleine Korrektur: man kann sehr wohl, und man muss dazu nichtmal die Umleitung deaktiveren. Siehe Accessing an Alternate Registry View - speziell das Flag KEY_WOW64_64KEY.

Wenn Du das nicht meintest und wir unter Umleitung verschiedenes verstehen ;)

Luckie 27. Jun 2011 10:25

AW: Liste aller installierten Programme
 
Ok, so geht es natürlich auch.

generic 27. Jun 2011 11:29

AW: Liste aller installierten Programme
 
Zitat:

Zitat von CCRDude (Beitrag 1108478)
Kleine Korrektur: man kann sehr wohl, und man muss dazu nichtmal die Umleitung deaktiveren. Siehe Accessing an Alternate Registry View - speziell das Flag KEY_WOW64_64KEY.

Jupp, so geht es - ich kann ja nicht alles verraten was mein Software-UpTodate so zaubert.

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