Inno setup 在Inno安装程序中加载卸载过程的外部DLL

Inno setup 在Inno安装程序中加载卸载过程的外部DLL,inno-setup,pascalscript,vcl-styles,vcl-styles.-utils,Inno Setup,Pascalscript,Vcl Styles,Vcl Styles. Utils,我正在尝试加载VclStylesInno.dll以卸载Inno安装程序。 下一个代码在 [代码] < /code >中声明: procedure-uLoadVCLStyle(VClStyleFile:String); 外部“LoadVCLStyleW@{app}/VclStylesInno.dll stdcall”; 但我遇到了一个错误 在初始化“app”常量之前,尝试将其展开 为卸载过程加载DLL的最佳方法是什么?我假设您在启动安装程序时收到错误,而不是卸载程序 当安装程序启动时,{app}

我正在尝试加载VclStylesInno.dll以卸载Inno安装程序。 下一个代码在<代码> [代码] < /code >中声明:
procedure-uLoadVCLStyle(VClStyleFile:String);
外部“LoadVCLStyleW@{app}/VclStylesInno.dll stdcall”;
但我遇到了一个错误

在初始化“app”常量之前,尝试将其展开


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

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

当安装程序启动时,
{app}
显然是未知的

但是,由于您只需要为卸载程序导入,而卸载程序知道
{app}
,因此您可以添加:

procedure-uLoadVCLStyle(VClStyleFile:String);
外部“LoadVCLStyleW@{app}\VclStylesInno.dll stdcall uninstallonly”;
虽然它并没有真正的帮助,因为卸载程序将要删除DLL,但失败了,因为它已经锁定了DLL本身

解决方案很简单,只需按照官方要求进行

基本上,您需要将DLL安装在
{app}
之外的其他地方,并在卸载时将DLL留在后面。这实际上是一个丑陋的解决方案,imho不支持样式化的卸载程序。但这是你的选择


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

这应该可以做到(请注意):

[代码]
程序LoadVCLStyle_UnInstall(VClStyleFile:String);
外部“LoadVCLStyleW@{%TEMP}\VclStylesInno.dll stdcall uninstallonly delayload”;
函数初始化安装:布尔值;
开始
如果FileCopy(ExpandConstant({app}\VclStylesInno.dll'),
ExpandConstant(“{%TEMP}\VclStylesInno.dll”),False)和
FileCopy(ExpandConstant({app}\skin.vsf'),
ExpandConstant('{%TEMP}\skin.vsf'),False)然后
开始
LoadVCLStyle_卸载(ExpandConstant(“{%TEMP}\skin.vsf”);
结束;
结束;
虽然我没有对其进行测试,但最好使用而不是
{%TEMP}
(卸载程序父进程可能会在卸载完成后立即删除这些文件,并且您不会干扰其他可能希望将
VclStylesInno.dll
存储到
%TEMP%
的进程)


有关另一种解决方案(更好但更复杂的实现),请参见

我认为这个箱子适合我的要求:谢谢。我有它的工作,我认为这应该是官方文件。
[Files]
Source: VclStylesInno.dll; DestDir: {app}
Source: skin.vsf; DestDir: {app}