不通過系統環境變量設置DLL的加載目錄

分兩種情況:顯式加載和隱式加載

顯式加載
調用dll時通過LoadLibrary加載指定目錄下的動態庫,這種方式很靈活
但如果所調用的dll依賴於別的動態庫,而且這些動態庫所在的路徑並不在應用程序運行目錄或系統路徑內,將會導致調用失敗
此時,我們可以在LoadLibrary前,通過SetDllDirectory將所有依賴項的路徑添加到系統路徑

隱式加載
不同於顯式加載,應用程序開始運行時自動調用dll,系統會默認從以下路徑搜索動態庫(MSDN說明):

1. 包含EXE文件的目錄, 
2. 進程的當前工作目錄, 
3. Windows系統目錄, 
4. Windows目錄, 
5. 列在Path環境變量中的一系列目錄

由於沒有辦法定位調用dll的確切時間,我們無法通過SetDllDirectory的方法事先設置動態庫的搜索路徑
方案一:最簡單的做法是將依賴庫全部拷貝至應用程序的運行目錄,但對於一些體積較大的動態庫,我們有N個應用程序,每個程序複製一份動態庫,顯然不妥;
方案二:另一種做法,我們可以將動態庫放到一個固定的目錄,將該目錄設置到系統環境變量Path;
方案三:如果不用環境變量,怎麼做?
有一種做法叫做“延遲加載”,就是將dll的隱式加載改爲顯式加載,通過設置項目屬性的鏈接-輸入-延遲加載dll,然後在代碼裏通過LoadLibrary加載所需的DLL,此時就可以運用SetDllDirectory的方法了。
但如果dll有很多個,這樣也比較麻煩,有沒有更加方便的方法?暫時沒找到

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