通过OLE Pascal/ Delphi /Inno设置查找MSI信息

ni65a41a  于 2023-04-20  发布在  其他
关注(0)|答案(1)|浏览(104)

我试图建立一个调查MSI文件属性的函数,从我的“Inno Setup”脚本。(我在“版本”后特别。)
我使用这个powershell脚本作为参考:https://technotes.khitrenovich.com/check-msi-version-powershell/
我不能让它在Inno Setup中工作。所以,我已经切换到 Delphi 。(一个更好的工具等)和Delphi代码输出与Inno Setup完全相同的错误。(所以,这是什么。)
我创建了这个测试函数:

procedure Test( MsiFileName : String ) ;
var
  installer : Variant;
  database : Variant;
  sql : String;
  view : Variant;
  rec : Variant;
  dummy1 : Boolean;
  dummy2 : Integer;
  dummy3 : array of String;
begin

  MsiFileName := 'C:\Users\....\My.msi';     //Test

  CoInitialize(nil);

  installer := CreateOleObject('WindowsInstaller.Installer');
  database := installer.OpenDatabase( MsiFileName, 0 );
  sql := 'SELECT Value FROM Property WHERE Property = ''ProductVersion''';
  view := database.OpenView(sql);
  view.Execute();
  rec := view.Fetch();

  dummy1 := rec.IsNull;       //Fail!
  dummy2 := rec.DataSize;     //Fail!
  dummy3 := rec.StringData;   //Fail!

end;

我用msi文件和powershell脚本做了几个测试,powershell脚本和msi文件都能正常工作。(可以调查)但是无论我做什么,都不能让它在Inno Setup和/或 Delphi 中工作,当代码到达“记录属性”时它失败了,出现了一个“类型不匹配”异常。我已经试过了几乎所有可能的“类型”。虽然我不是 Delphi 程序员。我的猜测是,返回的“record”在某种程度上不是记录...?record / Fetch的文档可以在这里找到:https://learn.microsoft.com/en-us/windows/win32/msi/view-fetch
同样,代码在PowerShell中运行良好。我也看到VBScripts也能正常工作。有人知道我缺少什么吗?

ioekq8ef

ioekq8ef1#

至于为什么东西似乎在powershell中工作,而不是在Inno Setup / Delphi 中,我没有必要变得更聪明。然而,对于上面的问题,我发现这一行可以工作:

string_variable := rec.StringData[1]

(And这是最重要的一个。)这个ofc是第一个,我应该试过的!……所以我做了。* 咕哝咕哝 *

相关问题