InnoSetup MsiQueryProductState

4

我希望用Inno Setup来替换VS安装程序。如果发现旧版本已经安装,可以使用'MsiQueryProductState'方法进行检查。 我找到了几个类似以下示例的例子:

function MsiQueryProductState(ProductCode: string): integer;
  external 'MsiQueryProductStateA@msi.dll stdcall';
function MsiConfigureProduct(ProductCode: string;
  iInstallLevel: integer; eInstallState: integer): integer;
  external 'MsiConfigureProductA@msi.dll stdcall';
const
  INSTALLSTATE_DEFAULT = 5;
  INSTALLLEVEL_MAXIMUM = $ffff;
  INSTALLSTATE_ABSENT = 2;

检查产品始终返回2而不是所需的5个值(INSTALLSTATE_DEFAULT)

我找到了错误,我将其发布为答案...

感谢Freddy


2
如果您自己找到了解决方案,应该将其发布为答案。然后几个小时后可以将其标记为已接受。 - Deanna
1个回答

4
问题出在InnoSetup的Unicode版本与函数原型的ANSI版本混用。只需要用MsiQueryProductStateW替换MsiQueryProductStateA即可。
如果您使用这个有条件定义的脚本,InnoSetup编译预处理器将根据您使用ANSI还是Unicode InnoSetup来自动查找正确的函数版本(Unicode或ANSI)。
[Code]
#IFDEF UNICODE
  #DEFINE AW "W"
#ELSE
  #DEFINE AW "A"
#ENDIF

function MsiQueryProductState(ProductCode: string): integer;
  external 'MsiQueryProductState{#AW}@msi.dll stdcall';
function MsiConfigureProduct(ProductCode: string;
  iInstallLevel: integer; eInstallState: integer): integer;
  external 'MsiConfigureProduct{#AW}@msi.dll stdcall';

+1,我用一个小技巧扩展了你的答案(最初由kobik 在这里发现)。你能否审核我的编辑,并在不喜欢它的情况下选择回滚?谢谢! - TLama

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接