我假设您在启动安装程序而不是卸载程序时遇到了错误。
安装程序启动时,{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?