我正在尝试为Inno Setup的卸载形式加载VclStylesInno.dll。
下一个代码在[Code]
部分的中间声明:
procedure uLoadVCLStyle(VClStyleFile: String);
external 'LoadVCLStyleW@{app}/VclStylesInno.dll stdcall';
但我遇到了错误
尝试在初始化之前扩展“app”常量
为卸载过程加载DLL的最佳方法是什么?
答案 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?