
Listar programas instalados y en que ruta se han instalado
#1
Escrito 10 septiembre 2009 - 11:00
Me interesa que aparezcan en dos listas, la primera con todos los instalados y en la segunda los que yo quiero añadir para obtener su ruta y nombre de la aplicación.
Mas o menos como una lista dual.
Ya mire la Cadena del registro de Windows UNistall, pero la ruta de los mismos no aparece.
Alguna sugerencia...
Gracias...
#2
Escrito 10 septiembre 2009 - 11:06
Listar los programas instalados en Windows
Windows almacena la lista de programas instalados (Agregar/Quitar
programas) en la clave de registro:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
\
En esa clave hay tantas subclaves como programas instalados. Pero lo que nos
interesa a nosotros no es el nombre de la clave del programa instalado sino el
nombre del programa que muestra Windows en Agregar/Quitar programas.
Para ello entramos en cada clave y leemos el valor DisplayName.
Lo primero añadimos la unidad:
uses
Windows, Messages, ..., Registry;
Y aquí tenemos un procedimiento al cual le pasamos un ListBox y nos lo
rellena con la lista de programas instalados en Windows:
procedure ListarAplicaciones( Lista: TListBox );
const
INSTALADOS = '\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall';
var
Registro: TRegistry;
Lista1 : TStringList;
Lista2 : TStringList;
j, n : integer;
begin
Registro := TRegistry.Create;
Lista1 := TStringList.Create;
Lista2 := TStringList.Create;
// Guardamos todas las claves en la lista 1
with Registro do
begin
RootKey := HKEY_LOCAL_MACHINE;
OpenKey( INSTALADOS, False );
GetKeyNames( Lista1 );
end;
// Recorremos la lista 1 y leemos el nombre del programa instalado
for j := 0 to Lista1.Count-1 do
begin
Registro.OpenKey( INSTALADOS + '\' + Lista1.Strings[j], False );
Registro.GetValueNames( Lista2 );
// Mostramos el programa instalado sólo si tiene DisplayName
n := Lista2.IndexOf( 'DisplayName' );
if ( n <> -1 ) and ( Lista2.IndexOf('UninstallString') <> -1 )
then
Lista.Items.Add( ( Registro.ReadString( Lista2.Strings[n] ) ) );
end;
Lista.Sorted := True; // Ordenamos la lista alfabéticamente
Lista1.Free;
Lista2.Free;
Registro.CloseKey;
Registro.Destroy;
end;
Con esto se podría hacer un programa que eliminara de Agregar/Quitar
programas aquellas claves de programas mal desinstalados.
Pruebas realizadas en Delphi 7.
lo encontre en un manual llamado delphi al limite, chequea si te sirve por lo menos de guia
#3
Escrito 10 septiembre 2009 - 11:12
Uses Registry; ... procedure TForm1.Button1Click(Sender: TObject); var MyList: TStringList; MyRegistry: TRegistry; i: Integer; Str: string; begin MyRegistry:=TRegistry.Create; MyList:=TStringList.Create; with MyRegistry do begin RootKey:=HKEY_LOCAL_MACHINE; if OpenKey( 'Software\Microsoft\Windows\CurrentVersion\Uninstall', False)=True then GetKeyNames(MyList); CloseKey; for i:=0 to MyList.Count-1 do begin RootKey:=HKEY_LOCAL_MACHINE; OpenKey( 'Software\Microsoft\Windows\CurrentVersion\Uninstall\'+ MyList[i], False); Str:=ReadString('DisplayName'); if Str<>'' then Memo1.Lines.Add(ReadString('DisplayName')); CloseKey; end; end; end;
Saludos.
#4
Escrito 10 septiembre 2009 - 11:16
Como os comente esa solución ya la mire y en el registro de windos aparece la cadena de desinstalación pero no la ruta del exe principal.
otra sugerencia??
Saludos
#5
Escrito 10 septiembre 2009 - 11:23
procedure TForm1.Button1Click(Sender: TObject); var MyList: TStringList; MyRegistry: TRegistry; i: Integer; Str: string; begin MyRegistry:=TRegistry.Create; MyList:=TStringList.Create; with MyRegistry do begin RootKey:=HKEY_LOCAL_MACHINE; if OpenKey( 'Software\Microsoft\Windows\CurrentVersion\Uninstall', False)=True then GetKeyNames(MyList); CloseKey; for i:=0 to MyList.Count-1 do begin RootKey:=HKEY_LOCAL_MACHINE; OpenKey( 'Software\Microsoft\Windows\CurrentVersion\Uninstall\'+ MyList[i], False); Str:=ReadString('DisplayName'); if Str<>'' then Memo1.Lines.Add(ReadString('DisplayName')+' - '+ReadString('InstallSource')); CloseKey; end; end; end;
Saludos.
#6
Escrito 10 septiembre 2009 - 03:33
Lo que quiero es por ejemplo:
Nombre descriptivo ----> Ruta y Exe.
Microsoft Word 2003---> c:\Officeword\WINWORD.EXE
Gracias de nuevo...
A ver si se puede o no...

#7
Escrito 11 septiembre 2009 - 03:26
Google Earth - C:\Archivos de programa\Google\Google Earth\
Ahora solo falta obtener el exe (EARTH.exe)
¿Existe alguna API que dando su descripción saque el exe? (Google Earth-->EARTH.exe)

#8
Escrito 11 septiembre 2009 - 07:27

Saludos.