【问题标题】:Load external DLL for uninstall process in Inno Setup在 Inno Setup 中为卸载过程加载外部 DLL
【发布时间】:2016-04-29 14:08:09
【问题描述】:

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

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

但我遇到了一个错误

尝试在“app”常量初始化之前对其进行扩展

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

【问题讨论】:

标签: inno-setup pascalscript vcl-styles vcl-styles.-utils


【解决方案1】:

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

安装程序启动时,{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即可。

您基本上需要将 DLL 安装在 {app} 以外的其他位置,并在卸载时留下 DLL。这实际上是一个丑陋的解决方案,恕我直言并不能证明风格化的卸载程序是合理的。但这是你的选择。


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

应该这样做(注意delayload option):

[Files]
Source: VclStylesInno.dll; DestDir: {app}
Source: skin.vsf; 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) and
     FileCopy(ExpandConstant('{app}\skin.vsf'),
              ExpandConstant('{%TEMP}\skin.vsf'), False) then
  begin
    LoadVCLStyle_UnInstall(ExpandConstant('{%TEMP}\skin.vsf'));
  end;
end;

虽然我没有对其进行测试,但使用 {tmp} 而不是 {%TEMP} 可能会更好(这些文件可能会在卸载完成后立即被卸载程序父进程删除 - 您不会干扰其他可能想要将VclStylesInno.dll 存储到%TEMP% 的进程)。


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

【讨论】:

  • 谢谢。我有它的工作,我认为这应该是官方文档。
猜你喜欢
  • 2016-05-28
  • 2018-05-04
  • 1970-01-01
  • 1970-01-01
  • 2012-11-16
  • 2016-01-14
  • 2017-08-15
  • 2016-09-27
  • 2011-12-06
相关资源
最近更新 更多