zoukankan      html  css  js  c++  java
  • 读取软件卸载信息和桌面图标列表

    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

  • 相关阅读:
    CentOS 8上安装MySQL 8.0
    centos8安装redis
    virtualbox虚拟机ubuntu18.04网络配置--虚拟机和宿主机互通且联网
    Controller同时接收MultipartFile数据和json数据
    日期转换
    Python的Mysql操作
    Go语言学习笔记十三: Map集合
    Go语言学习笔记十二: 范围(Range)
    Go语言学习笔记十一: 切片(slice)
    Go语言学习笔记十: 结构体
  • 原文地址:https://www.cnblogs.com/findumars/p/7126679.html
Copyright © 2011-2022 走看看