使用MSI读出本机已经安装软件列表

本文介绍了一个Delphi程序,该程序能够利用Windows Installer API枚举本地计算机上已安装的软件,获取软件名称、版本及安装路径,并显示在Delphi窗体的Memo控件中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

type
  PsoftItem = ^TSoftItem;
  TSoftItem = packed record
    SoftName: string;
    SoftVer: string;
    Path: string;
  end;

 

procedure ReadLocalSoftByMSI(aList: TList);
var
  Index: Integer;
  Buf: array [0..38] of char;
  PropBuf: PChar;
  hr: UINT;
  Len: DWORD;
  P: PSoftItem;
begin
  if not Assigned(aList) then exit;
  for Index := aList.Count-1 downto 0 do
  begin
    P := aList.Items[Index];
    if Assigned(P) then DisPose(P);
  end;
  aList.Clear;

  Index := 0;
  hr := MsiEnumProducts(Index, Buf);
  while hr = ERROR_SUCCESS do
  begin
    new(P);

    len := 0;
    MsiGetProductInfo(Buf, INSTALLPROPERTY_INSTALLEDPRODUCTNAME, nil, @len);
    Inc(Len);
    PropBuf := AllocMem(len);
    try
      MsiGetProductInfo(Buf, INSTALLPROPERTY_INSTALLEDPRODUCTNAME, PropBuf, @len);
      P^.SoftName := PropBuf;
    finally
      FreeMem(PropBuf);
    end;

    len := 0;
    MsiGetProductInfo(Buf, INSTALLPROPERTY_INSTALLLOCATION, nil, @len);
    Inc(Len);
    PropBuf := AllocMem(len);
    try
      MsiGetProductInfo(Buf, INSTALLPROPERTY_INSTALLLOCATION, PropBuf, @len);
      P^.Path := PropBuf;
    finally
      FreeMem(PropBuf);
    end;

    len := 0;
    MsiGetProductInfo(Buf, INSTALLPROPERTY_VERSIONSTRING, nil, @len);
    Inc(Len);
    PropBuf := AllocMem(len);
    try
      MsiGetProductInfo(Buf, INSTALLPROPERTY_VERSIONSTRING, PropBuf, @len);
      P^.SoftVer := PropBuf;
    finally
      FreeMem(PropBuf);
    end;

    if Trim(P^.SoftName) = '' then
    begin
      DisPose(P);
    end
    else
    begin
      aList.Add(P);
    end;

    Inc(Index);
    hr := MsiEnumProducts(Index, Buf);
  end;
end; 

 

使用这个函数,可以先在窗体上放置一个memo控件,然后在一个Button的OnClick事件中:

procedure TForm1.BitBtn1Click(Sender: TObject);
var
  List: TList;
  i: Integer;
  P: PSoftItem;
begin
  Memo1.Lines.Clear;

  List := TList.Create;
  try
    ReadLocalSoftByMSI(List);

    for i := 0 to List.Count-1 do
    begin
      P := List.Items[i];

      Memo1.Lines.Add(P^.SoftName);
      Memo1.Lines.Add(P^.SoftVer);
      Memo1.Lines.Add(P^.Path);

      Memo1.Lines.Add('');
    end;
  finally
    for i := 0 to List.Count-1 do
    begin
      P := List.Items[i];
      DisPose(P);
    end;

    List.Free;
  end;
end;

 

注意:使用这个函数需要引用jwaMsi单元,jwaMsi.pas文件可以到网上去下载。

此程序在WinXP Sp2+delphi 7 下调试通过

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值