Ciao a tutti, sto cercando di recuperare la lista dei software installati e mostrarli in una listview per eventualmente gestirne poi la disinstallazione o l'aggiornamento.
In pratica leggo dal registro le voci in HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
e poi tramite una funzione cerco di caricare le icone prese dalla voce "displayIcon" ma ci sono un po di cose che non mi tornano.
Innanzitutto non mi trovo tutti i software installati, anzi... se apro il regedit e vado a quella posizione trovo addirittura valori differenti rispetto se accedo al registro da delphi (quindi i valori popolati nella listview)
tanto per esempio.... aprendo regedit trovo 7zip che invece nella listview creata da delphi non vedo...
Non riesco a capire come mai.
Poi le icone qualcuna me la carica qualcuna no.. insomma quelo che mi piacerebbe ottenre è una cosa simile a quella che troviamo in pannello di controllo->disinstalla un programma... ma anche li i software installati sono totalmente differenti, come anche le voci che posso caricare utilizzando il registro,per esempio "autore", installarto il"...
come e dove recupera la lista il pannello di controllo?..
questo il codice che uso:
procedure TForm2.Button3Click(Sender: TObject);
const
UNINST_PATH = 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall';
var
Reg: TRegistry;
SubKeys: TStringList;
ListItem: TlistItem;
i: integer;
sDisplayName, sUninstallString,sicon: string;
begin
ListView1.ViewStyle := vsReport;
ListView1.Columns.add;
ListView1.Columns.add;
ListView1.Columns.add;
ListView1.Columns.add;
ListView1.Columns[0].caption := 'DisplayName';
ListView1.Columns[1].caption := 'UninstallString';
ListView1.Columns[2].caption := 'sicon';
ListView1.Columns[2].caption := 'icon';
ListView1.Columns[0].Width := 300;
ListView1.Columns[1].Width := 300;
Reg := TRegistry.Create;
with Reg do
try
with ListView1.Items do
try
BeginUpdate;
Clear;
RootKey := HKEY_LOCAL_MACHINE;
if OpenKeyReadOnly(UNINST_PATH) then
begin
SubKeys := TStringList.Create;
try
GetKeyNames(SubKeys);
CloseKey;
for i := 0 to subKeys.Count - 1 do
if OpenKeyReadOnly(Format('%s\%s', [UNINST_PATH, SubKeys[i]])) then
try
sDisplayName := ReadString('DisplayName');
sUninstallString := ReadString('UninstallString');
sicon := ReadString('DisplayIcon');
if sDisplayName <> '' then
begin
ListItem := Add;
ListItem.Caption := sDisplayName;
ListItem.subitems.Add(sUninstallString);
ListItem.subitems.Add(sicon);
try
ListItem.ImageIndex:=ImageList1.AddIcon(geticonfile(sicon));
except
end;
end;
finally
CloseKey;
end;
finally
SubKeys.Free;
end;
end;
finally
ListView1.AlphaSort;
EndUpdate;
end;
finally
CloseKey;
Free;
end;
end;
function TForm2.geticonfile(filename:string):ticon;
var
Icon: TIcon;
FileInfo: SHFILEINFO;
begin
Icon := TIcon.Create;
try
SHGetFileInfo(PChar(filename), 0, FileInfo, SizeOf(FileInfo), SHGFI_ICON);
icon.Handle := FileInfo.hIcon;
result:=icon;
ImageList1.AddIcon(icon);
finally
Icon.Free;
end;
end;