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.
El secreto de mi éxito es Jesús
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!
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
El secreto de mi éxito es Jesús
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!
Responder

Volver a “Fuentes”