解決Inno setup調用有依賴其他dll的dll加載問題

在Inno setup打包工具中,提供了加載DLL以及調用DLL中的函數方法,相關函數聲明如下圖所示:

[Files]
Source: "A.dll"; Flags: dontcopy
;B.dll爲通用模塊,還有其他dll依賴B.dll
Source: "B.dll"; DestDir: "{app}"

[Code]
procedure MyFunc(hWnd: Integer; lpText, lpCaption: AnsiString; uType: Cardinal);
external 'MyFunc@files:A.dll stdcall';

這些在Inno setup給的幫助文檔中都有詳細說明;如果我們直接加載的DLL又需要依賴其他DLL,其關係網絡如下所示,如果沒有進行一些特殊處理,我們將無法成功執行相關函數:
在這裏插入圖片描述
對於這種情況,我們要做一些適當的處理,最重要的一步就是在調用MyFunc函數前,需要將B.dll提前加載起來或者將B.dll放到指定路徑,比如系統目錄;這樣在執行MyFunc函數時就不會因爲依賴問題導致執行失敗了。

修改後的打包腳本代碼如下:

[Files]
Source: "A.dll"; Flags: dontcopy
;B.dll爲通用模塊,還有其他dll依賴B.dll
Source: "B.dll"; DestDir: "{app}"

[Code]
procedure MyFunc(hWnd: Integer; lpText, lpCaption: AnsiString; uType: Cardinal);
external 'MyFunc@files:A.dll stdcall delayload';//延遲加載dll

procedure InitializeWizard;
var
   iErrCode: Integer; 
begin
    //其他安裝包中B.dll
    ExtractTemporaryFile('B.dll');
    //第一種:B.dll拷貝到系統目錄
    FileCopy(ExpandConstant('{tmp}\B.dll'),ExpandConstant('{sys}\B.dll'), False);
    //第二中方式:提前加載dll到系統中
    //LoadDLL(ExpandConstant('{tmp}\B.dll'), iErrCode) 
end;

通過以上修改就可以支持dll又依賴其他dll,導致函數執行失敗的問題了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章