我假設你在啓動安裝程序時出現錯誤,而不是卸載程序。
當安裝程序啓動時,{app}
顯然還未知。
但正如你所需要的進口只卸載程序,它知道{app}
,您可以添加uninstallonly
option:
procedure uLoadVCLStyle(VClStyleFile: String);
external '[email protected]{app}\VclStylesInno.dll stdcall uninstallonly';
雖然它並沒有真正幫助,因爲卸載程序將要刪除的DLL,失敗,因爲它自己鎖定了DLL。
解決方案很簡單,只需按照官方instructions for uninstalling the VCL Styles for Inno Setup。
您基本上需要安裝DLL,而不是在{app}
以外的位置,並在卸載時將DLL留在後面。這實際上是一個醜陋的解決方案,imho不能證明樣式化的卸載程序。但這是你的選擇。
如你所說,你可以將DLL複製到Windows臨時文件夾,從那裏加載它,並希望爲Windows最終刪除臨時目錄清理過程中的DLL。
這應該做(注意delayload
option):
[Files]
Source: VclStylesinno.dll; DestDir: {app}
[Code]
procedure LoadVCLStyle_UnInstall(VClStyleFile: String);
external '[email protected]{%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?
我認爲,這種情況下適合我的要求:如何在Inno安裝程序中將VCL樣式應用於基於DLL的表單以進行卸載?無法導入DLL](http://stackoverflow.com/questions/36745054/how-to-apply-vcl-styles-to-dll-based-forms-in-inno-setup-for-uninstall-cannot-i) –