在Inno Setup中加载外部DLL以进行卸载过程

时间:2016-04-29 14:08:09

标签: inno-setup pascalscript

我正在尝试为Inno Setup的卸载形式加载VclStylesInno.dll。 下一个代码在[Code]部分的中间声明:

procedure uLoadVCLStyle(VClStyleFile: String);
    external 'LoadVCLStyleW@{app}/VclStylesInno.dll stdcall';

但我遇到了错误

  

尝试在初始化之前扩展“app”常量

为卸载过程加载DLL的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

我假设您在启动安装程序时遇到错误,而不是卸载程序。

安装程序启动时,{app}显然未知。

但由于您只需要卸载程序的导入(知道{app}),您可以添加uninstallonly option

procedure uLoadVCLStyle(VClStyleFile: String); 
  external 'LoadVCLStyleW@{app}\VclStylesInno.dll stdcall uninstallonly';

虽然它没有真正帮助,因为卸载程序会想要删除DLL,但是失败了,因为DLL已经锁定了自己。

解决方案很简单,只需遵循官方instructions for uninstalling the VCL Styles for Inno Setup

你基本上需要在{app}以外的地方安装DLL,并在卸载时留下DLL。这实际上是一个丑陋的解决方案,imho不能证明风格的卸载程序是正确的。但这是你的选择。

正如您的建议,您可以将DLL复制到Windows临时文件夹,从那里加载它,并希望Windows在临时目录清理期间最终删除DLL。

这应该做(注意delayload option):

[Files]
Source: VclStylesinno.dll; DestDir: {app}

[Code]

procedure LoadVCLStyle_UnInstall(VClStyleFile: String); 
  external 'LoadVCLStyleW@{%TEMP}\VclStylesInno.dll stdcall uninstallonly delayload';

function InitializeUninstall: Boolean;
begin
  if FileCopy(ExpandConstant('{app}\VclStylesinno.dll'),
              ExpandConstant('{%TEMP}\VclStylesinno.dll'), False) then
  begin
    LoadVCLStyle_UnInstall(...);
  end;
end;

对于另一种解决方案(更好但实施起来更复杂),请参阅How keep uninstall files inside uninstaller?