我想用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
答案 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';