读取软件卸载信息和桌面图标列表

unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Registry, StdCtrls, ComCtrls, IOUtils, Types;

type
  TForm2 = class(TForm)
    pgc1: TPageControl;
    ts1: TTabSheet;
    lst1: TListBox;
    btn1: TButton;
    ts2: TTabSheet;
    btn2: TButton;
    lst2: TListBox;
    procedure btn1Click(Sender: TObject);
    procedure btn2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

function GetShellFolders(strDir: string): string;
function GetTarget(const LinkFile: string): string;

implementation

uses ShlObj, ActiveX, ComObj;
{$R *.dfm}

/// <summary>
/// 读取可卸载软件信息
/// </summary>
/// <param name="Sender"></param>
procedure TForm2.btn1Click(Sender: TObject);
var
  reg: TRegistry;
  myList: TStringList;
  i: integer;
  curkey, SName: string;
  hasUn: Boolean;
begin
  reg := TRegistry.Create;
  myList := TStringList.Create;
  reg.RootKey := HKEY_LOCAL_MACHINE;
  if reg.OpenKey('SoftwareMicrosoftWindowsCurrentVersionuninstall', False)
    then
  Begin
    reg.GetKeyNames(myList);
    curkey := reg.CurrentPath;
    reg.CloseKey;
    for i := 0 to myList.Count - 1 do
      if reg.OpenKey(curkey + '' + myList.Strings[i], False) then
      Begin
        if reg.ValueExists('DisplayName') then
          SName := reg.ReadString('DisplayName')
        else
          SName := myList.Strings[i];
        if reg.ValueExists('DisplayVersion') then
          SName := SName + ' 版本:' + reg.ReadString('DisplayVersion')
        else
          SName := myList.Strings[i];
        if reg.ValueExists('InstallSource') then
          SName := SName + ' 目录:' + reg.ReadString('InstallSource')
        else
          SName := myList.Strings[i];
        if reg.ValueExists('UnInstallString') then
        begin
          SName := SName + ' 卸载:' + reg.ReadString('UnInstallString');
          hasUn := True;
        end
        else
        begin
          SName := myList.Strings[i];
          hasUn := False;
        end;
        if hasUn then
          lst1.Items.Add(SName);
        // ShowMessage(SName);
        reg.CloseKey;
      end;
  end;
end;

function GetShellFolders(strDir: string): string;
const
  regPath = 'SoftwareMicrosoftWindowsCurrentVersionExplorerShell Folders';
var
  reg: TRegistry;
  strFolders: string;
begin
  reg := TRegistry.Create;
  try
    reg.RootKey := HKEY_CURRENT_USER;
    if reg.OpenKey(regPath, False) then
    begin
      strFolders := reg.ReadString(strDir);
    end;
  finally
    reg.Free;
  end;
  result := strFolders;
end;

/// <summary>
/// 读取桌面图标
/// </summary>
/// <param name="Sender"></param>
procedure TForm2.btn2Click(Sender: TObject);
var
  path, str: string;
  files: TStringDynArray;
begin
  path := GetShellFolders('Desktop');
  files := TDirectory.GetFiles(path, '*.lnk');
  for str in files do
    lst2.Items.Add(str + ' 目标:' + GetTarget(str));
end;

function GetTarget(const LinkFile: string): string;
const
  IID_IPersistFile: TGUID = '{0000010B-0000-0000-C000-000000000046}';
var
  intfLink: IShellLink;
  IntfPersist: IPersistFile;
  pfd: _WIN32_FIND_DATA;
  bSuccess: Boolean;
begin
  result := '';
  intfLink := CreateComObject(CLSID_ShellLink) as IShellLink;
  SetString(result, nil, MAX_PATH);
  {
    Load方法的第二个参数还可以传递STGM_WRITE或STGM_READWRITE,表示对快捷方式信息的访问权限
    STGM_READ:只读
    STGM_WRITE:只写
    STGM_READWRITE:读写
    GetPath方法的第三个参数还可以传递SLGP_UNCPRIORITY或SLGP_SHORTPATH,表示返回的目标路径格式
    SLGP_UNCPRIORIT:UNC网络路径
    SLGP_SHORTPATH :DOS 8.3格式路径
    SLGP_RAWPATH      : 长路径
    }
  bSuccess := (intfLink <> nil) and SUCCEEDED
    (intfLink.QueryInterface(IID_IPersistFile, IntfPersist)) and SUCCEEDED
    (IntfPersist.Load(PWideChar(WideString(LinkFile)), STGM_READ)) and SUCCEEDED
    (intfLink.GetPath(PChar(result), MAX_PATH, pfd, SLGP_RAWPATH));
  if not bSuccess then
    result := '';
end;

end.

http://www.cnblogs.com/toosuo/p/3637531.html

原文地址:https://www.cnblogs.com/findumars/p/7126679.html