![]() |
Installed Software function
Hi Delphianer
habe folgende Function im Netz gefunden:
Delphi-Quellcode:
Bekomme bei folgender Zeile:
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;
Delphi-Quellcode:
folgenden Fehler:
TmpResult := TmpResult + reg.ReadString('DisplayName') + CRLF;
Code:
Was habe ich den falsch gemacht?
[DCC Fehler] Unit1.pas(35): E2003 Undeklarierter Bezeichner: 'CRLF'
LG & Danke schon mal! |
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.) |
AW: Installed Software function
Funzt einwandfrei! DANKE!
|
AW: Installed Software function
Ich hoffe du weißt auch warum es jetzt geht und arbeitest nicht nur mit Copy & Paste :roll:
|
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.
|
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.
|
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?
|
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; |
AW: Installed Software function
<falsche Bedenken gelöscht>
|
AW: Installed Software function
Dann ist es einer weniger :zwinker:
|
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. |
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. |
AW: Installed Software function
War ja klar, dass ich was vergessen musste :roll:
Delphi-Quellcode:
Besser so?
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; |
AW: Installed Software function
Jepp, sieht brauchbar aus :mrgreen:
|
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. |
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; |
AW: Installed Software function
Dann übergib mal nil als List-Parameter.
|
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