Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Cómo saber si está instalado un programa y dónde (https://www.clubdelphi.com/foros/showthread.php?t=74749)

Casimiro Noteví 08-07-2011 12:52:28

Cómo saber si está instalado un programa y dónde
 
Hola, eso, no recuerdo ninguna función que me diga si está instalado un programa, y si lo está que me devuelva la ruta al mismo.
Algo así como:

Código Delphi [-]
function EstaInstalado(cPrograma:string):string;
begin
  result:='';  
  if jfdsjfdsfj(cPrograma) then
    result PathAlPrograma;
end;

Ejemplo:
Código Delphi [-]
ShowMessage( EstaInstalado('ibexpert') );

Ñuño Martínez 08-07-2011 13:34:28

En el peor de los casos, buscar en el registro. Supongo que es ahí de donde obtiene la lista el "Instalar y eliminar programas", ¿no?

Ahora bien, saber la clave y la variable y cómo se llama ya es otra cosa. :p

Neftali [Germán.Estévez] 08-07-2011 13:37:13

Revisa esta entrada: Inventario de software instalado (WMI)

No son 3 líneas, pero bueno... ;)
En el foro está también en este hilo junto con otras soluciones.

Casimiro Noteví 08-07-2011 14:58:33

¡¡¡Gracias!!!, :)
Sabía que lo había visto antes, pero ya no tengo cabeza para recordar tanta cosa, me hace falta un implante de disco duro.

Neftali [Germán.Estévez] 08-07-2011 15:11:16

Cita:

Empezado por Casimiro Notevi (Mensaje 405849)
...me hace falta un implante de disco duro.

:D:D:D

Lo único que las aplicaciones que aparecen son las que se han instalado utilizando Windows Installer.
Para otros casos habría que ir a leer directamente el registro.

ecfisa 08-07-2011 15:19:54

Hola Antonio.

Aca te pongo una version un poco modificada de la conocida versión del código. :)
Código Delphi [-]
uses Registry;
function isAppInstalled(AppName: string): Boolean;
const
  CLAVE = '\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall';
var
  Reg: TRegistry;
  L1,L2 : TStringList;
  j,dn,us: integer;
begin
  Reg:= TRegistry.Create;
  L1:= TStringList.Create;
  L2:= TStringList.Create;
  try
    Reg.RootKey:= HKEY_LOCAL_MACHINE;
    Reg.OpenKey(CLAVE, False);
    Reg.GetKeyNames(L1);
    Result:= False;
    for j := 0 to L1.Count-1 do
    begin
      Reg.OpenKeyReadOnly(CLAVE+'\'+L1.Strings[j]);
      Reg.GetValueNames(L2);
      if(L2.IndexOf('DisplayName')<> -1)and
        (L2.IndexOf('UninstallString')<> -1)and
        (Reg.ReadString('DisplayName')=AppName) then
          Result:= True;
    end;
  finally
    L1.Free;
    L2.Free;
    Reg.Free;
  end;
end;
Devuelve verdadero si encuentra el nombre de la aplicación.

Saludos.

Casimiro Noteví 08-07-2011 17:28:22

Gracias amigos, ahora a hacer pruebas para ver por qué me decido.

ecfisa 08-07-2011 22:14:34

Hola de nuevo Antonio.

Me acabo de dar cuenta que pegué una de mis pruebas pero no la final y aunque igual funciona, te hacerco mis disculpas. :o

Esta la versión que corresponde:
Código Delphi [-]
function isAppInstalled(AppName: string): Boolean;
const
  CLAVE = '\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\';
var
  Reg: TRegistry;
  L1,L2 : TStringList;
  c: integer;
begin
  Reg:= TRegistry.Create;
  L1:= TStringList.Create;
  L2:= TStringList.Create;
  try
    Reg.RootKey:= HKEY_LOCAL_MACHINE;
    Reg.OpenKey(CLAVE, False);
    Reg.GetKeyNames(L1);
    Result:= False;
    c:= 0;
    while not Result and (c < L1.Count) do
    begin
      Reg.OpenKeyReadOnly(CLAVE+L1[c]);
      Reg.GetValueNames(L2);
      if(L2.IndexOf('DisplayName')<> -1)and
        (L2.IndexOf('UninstallString')<> -1)and
        (Reg.ReadString('DisplayName')=AppName) then
          Result:= True;
      Inc(c);
    end;
  finally
    L1.Free;
    L2.Free;
    Reg.Free;
  end;
end;
Para obtener la ruta estoy un poco complicado.
En teoría deberían estar en: \SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\, pero no estan todas.
Y además hay casos como por ejemplo: Malwarebytes' Anti-Malware, cuyo nombre aparece como: mbam.exe. Allí si encontramos Path = C:\Program Files\Malwarebytes' Anti-Malware.
Entonces deberíamos enviar como argumento mbam y no Malwarebytes' Anti-Malware para que lo encuentre...
Voy a tener que investigar un poco mas. :(

Un saludo.

Casimiro Noteví 08-07-2011 22:29:20

Cita:

Empezado por ecfisa (Mensaje 405896)
Para obtener la ruta estoy un poco complicado.
En teoría deberían estar en: \SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\, pero no estan todas.
Y además hay casos como por ejemplo: Malwarebytes' Anti-Malware, cuyo nombre aparece como: mbam.exe. Allí si encontramos Path = C:\Program Files\Malwarebytes' Anti-Malware.
Entonces deberíamos enviar como argumento mbam y no Malwarebytes' Anti-Malware para que lo encuentre...
Voy a tener que investigar un poco mas. :(
Un saludo.

Sí, ya he visto que no siempre se corresponden los nombres "publicitarios" con los registrados en el sistema.
Parece que no es tan sencillo como se suponía debería ser.


La franja horaria es GMT +2. Ahora son las 05:16:13.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi