2014-10-18 57 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