Página 1 de 1

EnumInstalledPrograms [UNIT] [Fakedo0r]

Publicado: 19 Abr 2012, 01:49
por Fakedo0r
Devuelve los programas instalados junto a sus Uninstall's.

EJEMPLO

Imagen

Código: Seleccionar todo

//******************************************************************************
//* UNIT:         UNT_EnumInstalledPrograms
//* AUTOR:        Fakedo0r
//* FECHA:        19.04.2012
//* CORREO:       [email protected]
//* BLOG:         Sub-Soul.blogspot.com
//* USO:          EnumPrograms(' : ');
//******************************************************************************
unit UNT_EnumInstalledPrograms;
//******************************************************************************
//DECLARACIONES DE LIBRERIAS / CLASES
//******************************************************************************
interface

uses
  Winapi.Windows, System.SysUtils, Vcl.Dialogs;
//******************************************************************************
//DECLARACIONES DE FUNCIONES / PROCEDIMIENTOS
//******************************************************************************
function TrimA(sCadena: String): String;
function EnumPrograms(sDelimitador: String): String;
//******************************************************************************
implementation
//******************************************************************************
//<--- ENUMERA LOS PROGRAMAS INSTALADOS JUNTO A SUS UNINSTALL's --->
//******************************************************************************
function EnumPrograms(sDelimitador: String): String;
var
  ihKey:          HKEY;
  ihSubKey:       HKEY;
  dwIndex:        DWORD;
  dwName:         DWORD;
  dwDataSize:     DWORD;
  pszName:        PChar;
  sProName:       String;
  sProPath:       String;
  iRegType:       Integer;
  tLastWriteTime: FileTime;
begin
  dwIndex := 0;
  dwName := 0;
  dwDataSize := 0;
  iRegType := 1;

  if RegOpenKeyEx(HKEY_LOCAL_MACHINE, 'Software\Microsoft\Windows\CurrentVersion\Uninstall', 0, KEY_ENUMERATE_SUB_KEYS, ihKey) = ERROR_SUCCESS then;
  begin
    dwName := 255;
    GetMem(pszName, dwName);

    while RegEnumKeyEx(ihKey, dwIndex, @pszName[0], dwName, nil, nil, nil, @tLastWriteTime) = ERROR_SUCCESS do
    begin
      Inc(dwIndex);
      dwName := 255;

      if RegOpenKeyEx(ihKey, pszName, 0, KEY_QUERY_VALUE, ihSubKey) = ERROR_SUCCESS then
      begin

        if RegQueryValueEx(ihSubKey, 'DisplayName', nil, @iRegType, nil, @dwDataSize) = ERROR_SUCCESS then
        begin
          SetLength(sProName, dwDataSize);
          RegQueryValueEx(ihSubKey, 'DisplayName', nil, @iRegType, PByte(PChar(sProName)), @dwDataSize);

          sProName := TrimA(sProName);

          if RegQueryValueEx(ihSubKey, 'UninstallString', nil, @iRegType, nil, @dwDataSize) = ERROR_SUCCESS then
          begin

            if iRegType = REG_SZ then
            begin
              SetLength(sProPath, dwDataSize);
              RegQueryValueEx(ihSubKey, 'UninstallString', nil, @iRegType, PByte(PChar(sProPath)), @dwDataSize);

              sProPath := TrimA(sProPath);

              Result := Result + sProName + sDelimitador + sProPath + #13#10;
            end;
          end;
        end;
      end;
    end;
  end;
end;
//******************************************************************************
//<--- ELIMINA LOS ESPACIOS DE UNA CADENA --->
//******************************************************************************
function TrimA(sCadena: String): String;
begin
  Result := '';

  if sCadena = '' then Exit;

  while sCadena[1] = ' ' do
  begin
    Delete(sCadena, 1, 1);

    if sCadena = '' then Exit;
  end;

  while sCadena[Length(sCadena)] = ' ' do
  begin
    Delete(sCadena, Length(sCadena), 1);

    if sCadena = '' then Exit;
  end;

  Result := sCadena;
end;
end.
Saludos.

Re: EnumInstalledPrograms [UNIT] [Fakedo0r]

Publicado: 19 Abr 2012, 15:38
por Jefin_Silva
gracias, broth eso me servira :)

Re: EnumInstalledPrograms [UNIT] [Fakedo0r]

Publicado: 19 Abr 2012, 20:01
por BrunoBsso
Muy bueno Fakedo0r.
Consejo: en vez de usar tu funcion TrimA() podrías usar la nativa de Delphi que es Trim(Text: WideString) que, además de cumplir lo que necesitás, soporta cadenas de texto de amplia longitud y no perdés tiempo escribiendo.
Como dato aparte, TrimLeft(Text: WideString) y TrimRight(Text: WideString) que borran los espacios en blanco de la izquierda o derecha respectivamente.

Saludos!

Re: EnumInstalledPrograms [UNIT] [Fakedo0r]

Publicado: 19 Abr 2012, 21:51
por Fakedo0r
Gracias por el consejo aunque lo conocía, pero fíjate que pensaba que la función de Trim solo estaba en las nuevas versiones y por si acaso lo había codeado.. Yo uso la ide de embarcadero, versión 2012 XE2.

Saludos

Re: EnumInstalledPrograms [UNIT] [Fakedo0r]

Publicado: 20 Abr 2012, 01:08
por BrunoBsso
Me di cuenta que tenías XE2 por "Boost Libraries for C++Builder XE2".
Siempre es bueno codear uno mismo los métodos, así aprendés mucho más. Pero para la próxima te tardás un toque menos de tiempo :P

Saludos loco!