我们公司已从使用 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 版本。