我正在尝试加载VclStylesInno.dll以进行Inno Setup的卸载形式。在该[Code]
部分的中间声明下一个代码:
procedure uLoadVCLStyle(VClStyleFile: String);
external 'LoadVCLStyleW@{app}/VclStylesInno.dll stdcall';
但我遇到了一个错误
试图在初始化之前扩展“ app”常量
为卸载过程加载DLL的最佳方法是什么?
我假设您在启动安装程序而不是卸载程序时遇到错误。
当安装程序启动时,{app}
显然是未知的。
但是由于您只需要导入卸载程序(即){app}
,您可以添加以下uninstallonly
选项:
procedure uLoadVCLStyle(VClStyleFile: String);
external 'LoadVCLStyleW@{app}\VclStylesInno.dll stdcall uninstallonly';
尽管它并没有真正的帮助,但由于卸载程序会锁定DLL,因此卸载程序将要删除该DLL失败。
解决方案很简单,只需按照官方说明卸载Inno Setup的VCL样式即可。
基本上,您需要将DLL安装在之外的其他位置,{app}
并在卸载时将DLL留在后面。这实际上是一个丑陋的解决方案,imho并不能证明样式化的卸载程序是合理的。但这是您的选择。
按照您的建议,您可以将DLL复制到Windows临时文件夹,从那里加载它,并希望Windows在临时目录清理期间最终删除DLL。
这应该做(请注意delayload
选项):
[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%
)。
有关另一种解决方案(实施起来更好,但更复杂),请参阅
如何将卸载文件保留在卸载程序中?
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句