2014-10-18 56 views
1

問題: dll被編譯爲64位,使用dll的程序被編譯爲32位。VS2013 - LoadLibrary無法找到dll

解決方案:使用64位的64位dll編譯程序。


我有一個dll,我叫mydll.dll。我已經能夠在VS2013之外編譯.cpp文件,並且能夠加載dll。一旦我嘗試在VS2013和LoadLibrary(mydll.dll)中使用與我的.cpp相同的文件夾中的dll製作相同的.cpp文件,它無法找到dll,即使我直接路徑到dll,它仍然不起作用。

我的DLL已被證明在VS2013之外工作,所以我不認爲這是問題的根源。可能的來源是我的無知。

代碼:

(Main.cpp的)

int main(void){ 
    HINSTANCE dllHandle; 
    dllHandle = LoadLibrary("mydll.dll"); 
    if (!dllHandle){ 
     printf("dll no load\n"); 
     system("pause"); 
     return 1; 
    } 
    else{ 
     printf("dll load!\n"); 
    } 
} 
+2

你不應該把DLL在同一文件夾作爲cpp文件。它應該在exe文件所在的文件夾中。默認情況下,它們在Visual Studio中不會相同。還要確保你沒有混合32位和64位。我的意思是你不能加載64位應用程序中的32位DLL或32位應用程序中的64位DLL。 – drescherjm 2014-10-18 03:26:05

+0

@drescherjm你非常正確!我用Cuda的64位NVCC編譯我的Dll。我所要做的只是將VS2013中的構建設置更改爲x64,並且工作正常。如果您發佈它,我會將其設置爲答案。 – MichaelMitchell 2014-10-18 03:34:03

回答

4

如果你的dll在windows正在使用的搜索路徑中,請確保你沒有混合32位和64位。 Windows不會將32位dll加載到64位應用程序或64位dll中加載到32位應用程序中。

注意:見@Nard for Windows如何搜索答案的DLL:https://stackoverflow.com/a/26435819/487892

3

由於DLL加載程序運行時,您應該確保提供給LoadLibrary DLL的路徑是相對於可執行文件,或提供絕對路徑。請參閱MSDN文檔上的DLL如何定位時,你不提供一個絕對路徑:

Dynamic-Link Library Search Order

編譯將不會是一個處理DLL的加載在這種情況下,這樣cpp文件呢不需要找到該文件,而是需要找到該文件。

+0

感謝您的編輯。非常豐富! – Nard 2014-10-18 02:51:06

+0

正如問題中所說我試過... – MichaelMitchell 2014-10-18 03:04:08

+1

在這個問題中,你只說明該DLL位於與.cpp相同的文件夾中,因此我不能假定您的可執行文件也是從同一個文件夾運行的。 我試過你自己的代碼,它對我來說工作正常。 – Nard 2014-10-18 03:07:49