InnoSetup MsiQueryProductState

时间:2011-10-07 06:57:22

标签: windows-installer installation setup-project inno-setup

我想用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

1 个答案:

答案 0 :(得分:4)

问题是InnoSetup的Unicode版本与ANSI版本的函数原型混合在一起。用MsiQueryProductStateA替换MsiQueryProductStateW就足够了。

如果您使用此条件定义的脚本,InnoSetup编译预处理器将找到函数的正确版本(Unicode或ANSI),具体取决于您何时使用ANSI或Unicode InnoSetup。

[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';