Nein. Abgesehen davon, dass dieser Code voller Fehler ist, liefert er nur die Uninstall-Displaynamen, was ich ja in meiner obigen Definition ausgeschlossen habe. Hier ist der soweit entwanzte Code, der das nicht brauchbare Ergebnis liefert:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
const
REGKEYAPPS = '
\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\';
var
reg: TRegistry;
List1: TStringList;
List2: TStringList;
j, n: Integer;
begin
reg := TRegistry.Create;
List1 := TStringList.Create;
List2 := TStringList.Create;
{ Load all the subkeys }
with reg
do
begin
RootKey := HKEY_LOCAL_MACHINE;
Access := KEY_READ;
// WICHTIG WEGEN UAC !
OpenKey(REGKEYAPPS, false);
GetKeyNames(List1);
end;
{ Load all the Value Names }
for j := 0
to List1.Count - 1
do
begin
reg.OpenKey(REGKEYAPPS + '
' + List1.Strings[j], false);
reg.GetValueNames(List2);
{ We will show only if there is 'DisplayName' }
n := List2.IndexOf('
DisplayName');
if (n <> -1)
and (List2.IndexOf('
UninstallString') <> -1)
then
begin
memoPrograms.Lines.Add((reg.ReadString(List2.Strings[n])));
end;
end;
List1.Free;
List2.Free;
reg.CloseKey;
reg.Destroy;
end;