Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Installed Software function (https://www.delphipraxis.net/160636-installed-software-function.html)

value is NULL 24. Mai 2011 09:45

Installed Software function
 
Hi Delphianer

habe folgende Function im Netz gefunden:

Delphi-Quellcode:
function GetUninstallList : string;
const
  cUninstallPath = 'Software\Microsoft\Windows\CurrentVersion\Uninstall';
var
  reg: TRegistry;
  TmpKeyNames: TStringList;
  i: Integer;
  TmpResult: string;
begin
  TmpResult := '';
  Result := TmpResult;
  TmpKeyNames := TStringList.Create;
  TmpKeyNames.Clear;
  reg := TRegistry.Create;
  reg.RootKey := HKEY_LOCAL_MACHINE;
  if reg.KeyExists(cUninstallPath) then
    if reg.OpenKeyReadOnly(cUninstallPath) then
      reg.GetKeyNames(TmpKeyNames);
  reg.CloseKey;
  for i := 0 to TmpKeyNames.Count - 1 do
    if reg.OpenKeyReadOnly(cUninstallPath + '\' + TmpKeyNames.Strings[i]) then
    begin
      if reg.ValueExists('DisplayName') then
        TmpResult := TmpResult + reg.ReadString('DisplayName') + CRLF;
      reg.CloseKey;
    end;
  reg.Free;
  TmpKeyNames.Free;
  Result := TmpResult;
end;
Bekomme bei folgender Zeile:
Delphi-Quellcode:
TmpResult := TmpResult + reg.ReadString('DisplayName') + CRLF;
folgenden Fehler:
Code:
[DCC Fehler] Unit1.pas(35): E2003 Undeklarierter Bezeichner: 'CRLF'
Was habe ich den falsch gemacht?

LG & Danke schon mal!

Deep-Sea 24. Mai 2011 09:52

AW: Installed Software function
 
Ja wo ist denn CRLF definiert?! Nirgends, genau.
Ersetzte es z.B. mal mit sLineBreak.
(An sich wäre die Übergabe von TStrings hierfür eher geeignet ... aber naja.)

value is NULL 24. Mai 2011 10:04

AW: Installed Software function
 
Funzt einwandfrei! DANKE!

Deep-Sea 24. Mai 2011 10:09

AW: Installed Software function
 
Ich hoffe du weißt auch warum es jetzt geht und arbeitest nicht nur mit Copy & Paste :roll:

DeddyH 24. Mai 2011 10:16

AW: Installed Software function
 
Sehe ich das falsch, oder hat diese Funktion noch Optimierungspotential? Wozu die Variable tmpResult gebraucht wird, erschließt sich mir z.B. nicht.

Deep-Sea 24. Mai 2011 10:18

AW: Installed Software function
 
Das ist zwar sinnlos, aber nicht so schlimm. Schlimmer finde ich, dass kein Try-finally-Block genutzt wird, um die erzeugten Objekte sicher wieder freizugeben.

DeddyH 24. Mai 2011 10:20

AW: Installed Software function
 
Jepp, auch ein Clear einer gerade erzeugten TStringlist ist so flüssig, das ist schon überflüssig. Wer opfert sich und schreibt das mal ins Reine?

Deep-Sea 24. Mai 2011 10:34

AW: Installed Software function
 
Ich denke mal, so ist es besser. Ob mein Stil euch aber gefällt, ist eine andere Sache :wink:
Delphi-Quellcode:
procedure GetUninstallList(AList: TStrings);
const
  UNINSTALL_PATH = 'Software\Microsoft\Windows\CurrentVersion\Uninstall\';
  DISPLAY_NAME = 'DisplayName';
var
  LIndex: Integer;
begin
  AList.Clear;
  With TRegistry.Create do
  try
    RootKey := HKEY_LOCAL_MACHINE;
    If KeyExists(UNINSTALL_PATH) and OpenKeyReadOnly(UNINSTALL_PATH) then
    begin
      GetKeyNames(AList);
      CloseKey;
    end;
    LIndex := 0;
    While LIndex < AList.Count do
    begin
      If not (OpenKeyReadOnly(UNINSTALL_PATH + AList[LIndex]) and
        ValueExists(DISPLAY_NAME)) then AList.Delete(LIndex)
      else begin
        AList[LIndex] := ReadString(DISPLAY_NAME);
        Inc(LIndex);
      end;
      CloseKey;
    end;
  finally
    Free;
  end;
end;

Satty67 24. Mai 2011 10:55

AW: Installed Software function
 
<falsche Bedenken gelöscht>

DeddyH 24. Mai 2011 10:57

AW: Installed Software function
 
Dann ist es einer weniger :zwinker:

Satty67 24. Mai 2011 11:00

AW: Installed Software function
 
Man bist Du schnell... wollte mein Fehler schnell verstecken, aber Antwort ist schon da.

Hatte for im Kopf (das nur einmal die Bedingungen prüft), ist ja aber eine while Schleife.

DeddyH 24. Mai 2011 11:04

AW: Installed Software function
 
Jepp, das sollte also eigentlich sauber durchlaufen.

@Deep-Sea: ich würde noch prüfen, ob die übergebene Liste auch Assigned ist und dann mit BeginUpdate/EndUpdate leeren und neu befüllen. Hängt da eine grafische Ausgabe dran (ListBox.Items oder sowas übergeben), dann beschleunigt das ungemein.

Deep-Sea 24. Mai 2011 11:13

AW: Installed Software function
 
War ja klar, dass ich was vergessen musste :roll:
Delphi-Quellcode:
procedure GetUninstallList(AList: TStrings);
const
  UNINSTALL_PATH = 'Software\Microsoft\Windows\CurrentVersion\Uninstall\';
  DISPLAY_NAME = 'DisplayName';
var
  LIndex: Integer;
begin
  If Assigned(AList) then
  begin
    AList.BeginUpdate;
    try
      AList.Clear;
      With TRegistry.Create do
      try
        RootKey := HKEY_LOCAL_MACHINE;
        If KeyExists(UNINSTALL_PATH) and OpenKeyReadOnly(UNINSTALL_PATH) then
        begin
          GetKeyNames(AList);
          CloseKey;
        end;
        LIndex := 0;
        While LIndex < AList.Count do
        begin
          If not (OpenKeyReadOnly(UNINSTALL_PATH + AList[LIndex]) and
            ValueExists(DISPLAY_NAME)) then AList.Delete(LIndex)
          else begin
            AList[LIndex] := ReadString(DISPLAY_NAME);
            Inc(LIndex);
          end;
          CloseKey;
        end;
      finally
        Free;
      end;
    finally
      AList.EndUpdate;
    end;
  end;
end;
Besser so?

DeddyH 24. Mai 2011 11:16

AW: Installed Software function
 
Jepp, sieht brauchbar aus :mrgreen:

generic 24. Mai 2011 11:29

AW: Installed Software function
 
Nun jetzt da die Funktion technisch steht, sollte wir uns über den Namen der Funktion "GetUninstallList" unterhalten.

Denn Sie liefert keine UninstallList, sondern eine Liste von Installierten Programm und Updates, welche einen DisplayNamen haben.

Vor allem müsste noch diskutiert werden, was das Rückgabeergebnis der Funktion bringt.

Gut eine Liste von Programmen, aber was soll damit geschehen?
Werden zum Weiterverarbeiten noch anderen Werte benötigt?
Wenn Ja, können diese nicht gleich mit ermittelt werden?
Müssen Einträge gefiltert werden (z.B. Updates unterdrücken / nicht deinstallierbare verstecken)?

Ach ja, kleine Bug ist noch drin.
In 64Bit Umgebungen fehlen Einträge von 64Bit-Programmen in der Liste, da diese nicht im Wow64 Knoten abgelegt werden. Da im Dunstkreis ist auch noch ein Bug in alten Delphi Versionen, wenn auf 64Bit Knoten zugegriffen werden soll.

himitsu 24. Mai 2011 11:36

AW: Installed Software function
 
könnte auch schon ausreichen
Delphi-Quellcode:
procedure GetUninstallList(List: TStrings);
const
  UninstallPath = '\Software\Microsoft\Windows\CurrentVersion\Uninstall';
  DisplayName = 'DisplayName';
var
  i: Integer;
begin
  List.Clear;
  with TRegistry.Create(KEY_READ) do
    try
      RootKey := HKEY_LOCAL_MACHINE;
      if KeyExists(UninstallPath) and OpenKeyReadOnly(UninstallPath) then
        GetKeyNames(List);
      for i := List.Count - 1 downto 0 do
        if OpenKeyReadOnly(UninstallPath + '\' + List[i]) and ValueExists(DisplayName) then
          List[i] := ReadString(DisplayName);
        else
          List.Delete(i);
    finally
      Free;
    end;
end;

DeddyH 24. Mai 2011 11:39

AW: Installed Software function
 
Dann übergib mal nil als List-Parameter.

himitsu 24. Mai 2011 13:00

AW: Installed Software function
 
selber Schuld, wenn's knallt :twisted:


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:02 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