2

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

4

1 回答 1

1

这是一个未经测试的翻译,它应该只是在消息框中打印出相关的产品 G​​UID。该代码应与 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;
于 2013-07-14T22:13:01.783 回答