我们公司已经从使用InstallShield Express切换到使用Inno Setup(5.5.2版本)。我们使用InstallShield进行了多年的旧安装,但始终依赖InstallShield的升级代码GUID来处理以前版本的卸载。
我需要能够从新的Inno Setup安装程序中卸载以前安装的任何InstallShield版本。
经过一些研究后,看起来我需要调用MsiEnumRelatedProducts(),然后卸载所有找到的产品。
我找到了这个链接http://www.microsofttranslator.com/bv.aspx?from=de&to=en&a=http%3A%2F%2Fwww.inno-setup.de%2Fshowthread.php%3Fs%3D415e3895fda3e26e42739b004c0f51fb%26t%3D2857(原文为德文http://www.inno-setup.de/showthread.php?s=415e3895fda3e26e42739b004c0f51fb&t=2857)。看起来他非常接近,但他从不发布他的最终解决方案。
他说的代码有效(但对我来说是崩溃的):
type
TProductBuf = array[0..39] of char;
function MsiEnumRelatedProducts(lpUpgradeCode:string;
dwReserved, iProductIndex:cardinal;
var lpProductBuf:TProductBuf) : cardinal;
external 'MsiEnumRelatedProductsW@msi.dll setuponly stdcall';
function InitializeSetup : boolean;
var
ret, i, j : cardinal;
ProductBuf : TProductBuf;
ProductCode : string;
begin
Result := true;
i := 0;
repeat
ret := MsiEnumRelatedProducts('{#UPGRADE_CODE}', 0, i, ProductBuf);
if ret=0 then
begin
ProductCode := '';
for j := 0 to 39 do
begin
if ProductBuf[j] = #0 then
break;
ProductCode := ProductCode + ProductBuf[j];
end;
Result := uninstallOther(ProductCode);
end;
i := i+1;
until ret <> 0;
end;
他说这会让事情变得更容易吗?
SetLength(ProductCode, Pos(#0, ProductCode) - 1);
我是Pascal脚本的新手,我陷入了整个SetLength()部分。它在他说的功能中取代了什么,但崩溃了?
由于其他人说切换到字符串,我应该摆脱这个:
type
TProductBuf = array[0..39] of char;
如果有人能用英语向我展示最终的工作职能,那就太棒了!!!
提前致谢!
编辑: 我正在使用Inno Setup Compiler的ANSI版本。
答案 0 :(得分:1)
这是一个未经测试的翻译,应该只在消息框中打印出相关的产品GUID。代码应该与ANSI以及InnoSetup的Unicode版本一起使用:
[Code]
#ifdef UNICODE
#define AW "W"
#else
#define AW "A"
#endif
#define UPGRADE_CODE "<your upgrade here>"
const
ERROR_SUCCESS = $00000000;
ERROR_NOT_ENOUGH_MEMORY = $00000008;
ERROR_INVALID_PARAMETER = $00000057;
ERROR_NO_MORE_ITEMS = $00000103;
ERROR_BAD_CONFIGURATION = $0000064A;
function MsiEnumRelatedProducts(lpUpgradeCode: string; dwReserved: DWORD;
iProductIndex: DWORD; lpProductBuf: string): UINT;
external 'MsiEnumRelatedProducts{#AW}@msi.dll stdcall';
function InitializeSetup: Boolean;
var
I: Integer;
ProductBuf: string;
begin
Result := True;
I := 0;
SetLength(ProductBuf, 39);
while MsiEnumRelatedProducts('{#UPGRADE_CODE}', 0, I, ProductBuf) = ERROR_SUCCESS do
begin
MsgBox(ProductBuf, mbInformation, MB_OK);
I := I + 1;
SetLength(ProductBuf, 39);
end;
end;