2016-04-29 134 views
2

我試圖加載VclStylesInno.dll來卸載Inno Setup窗體。 接下來代碼是在[Code]節中段聲明:在Inno Setup中加載用於卸載過程的外部DLL

procedure uLoadVCLStyle(VClStyleFile: String); 
    external '[email protected]{app}/VclStylesInno.dll stdcall'; 

,但我面對

試圖擴大「應用程序」不斷有人初始化

前一個錯誤

什麼是加載DLL的卸載過程的最佳方式?

+0

我認爲,這種情況下適合我的要求:如何在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) –

回答

0

我假設你在啓動安裝程序時出現錯誤,而不是卸載程序。

當安裝程序啓動時,{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?

+0

我看到了將它移動到臨時文件夾的建議,但不知道如何去做,只要ExtractTemporaryFile proc不適用於卸載。 –

+0

謝謝你,馬丁。我正要使用FileCopy。 –

相關問題