2013-09-25 136 views
0

我需要在我的程序中使用libcurl.dll(在我的程序中依賴於libcurl.dll的二進制文件是「A.exe」),libcurl.dll依賴於zlib1.dll,libeay32.dll ,ssleay32.dll。 但在A.exe的文件夾中已經存在另一個版本libeay32.dll。 所以我打算創建一個文件夾「CURL」,把這次我介紹的新的4個DLL,然後使用動態DLL加載來調用libcurl.dll。Windows C++ DLL動態加載

=====================

 
Main folder 

| 

A.exe, 

libeay32.dll(old one), 

Folder "CURL" ----- 

        | 
        | 
       libcurl.dll, zlib1.dll, libeay32.dll, ssleay32.dll 

===================== 

的問題是,我怎麼能控制我的程序加載在文件夾「捲曲」的DLL 。 我可以通過調用來控制「A.exe」加載CURL \ libcurl.dll

HMODULE hModule = LoadLibrary(_T(「Curl \ libcurl.dll」)); 但是我怎樣才能控制zlib1.dll,libeay32.dll,ssleay32.dll的路徑。 看來,Windows搜索DLL中的默認A.exe本地文件夾。

+0

我找到一個解決方案,可以在高版本操作系統上工作。使用以下代碼加載DLL: LoadLibraryEx(「FullPathofA.exe」,NULL,LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR | LOAD_LIBRARY_DEFAULT_DIRS); 在低版本操作系統上是否有方法工作? Windows 7,Windows Server 2008 R2,Windows Vista和Windows Server 2008:此值需要安裝KB2533623。 Windows Server 2003和Windows XP:此值不受支持。 – Leon

+0

我不認爲這個方案會起作用:'libeay32.dll'已經被加載,所以它不會再被加載 - 即使版本不同! – MSalters

+0

@ MSalters但是如果他在加載libcurl.dll之前加載正確版本的libeay32.dll,如我所說? – SamuelVimes

回答

0

使用包括編譯器的directorys設置。或/和利用Windows邏輯來查找相關的DLL。 (您可以使用工具作爲filemon或process monitor查看查找哪個目錄正在查找)

使用windows的搜索路徑。訂單爲:

  1. 當前進程的可執行模塊所在的目錄。

  2. 當前目錄。

  3. Windows系統目錄。 GetSystemDirectory函數檢索此目錄的路徑。

  4. Windows目錄。 GetWindowsDirectory函數檢索此目錄的路徑。

  5. PATH環境變量中列出的目錄。

+0

我想你誤解了我的問題,我知道Windows搜索DLL的順序。我想將我的文件夾「CURL」添加到搜索列表中,並使其成爲DLL的第一個文件夾窗口搜索。 – Leon

+0

oke對不起,您使用的是什麼OS/IDE /編譯器 – lordkain

0

你應該能夠如果指定的DLL,而不是在調用一個相對完整的路徑與LoadLibrary加載它。當僅使用文件名或相對路徑時,搜索順序如lordKain所述(除非您修改它,例如通過調用SetDllDirectory),但在使用完整路徑時,它應該只在指定的位置搜索。您可以首先以這種方式加載所需的libeay32.dll版本,以便在加載libcurl.dll時,您需要的libeay32.dll版本已經加載。還要小心,沒有dll重定向清單。