【问题标题】:VS2013 - LoadLibrary cannot find dllVS2013 - LoadLibrary 找不到 dll
【发布时间】:2014-10-18 02:33:25
【问题描述】:

问题: dll 被编译为 64 位,使用 dll 的程序被编译为 32 位。

解决方法:在64位中使用64位dll编译程序。


我有一个名为mydll.dll 的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");
    }
}

【问题讨论】:

  • 您不应将 dll 与 cpp 文件放在同一文件夹中。它应该在 exe 文件所在的文件夹中。默认情况下,这些在 Visual Studio 中不会相同。还要确保您没有混合使用 32 位和 64 位。我的意思是你不能在 64 位应用程序中加载 32 位 dll 或在 32 位应用程序中加载 64 位 dll。
  • @drescherjm 你说的很对!我用 Cuda 的 64 位 NVCC 编译了我的 Dll。我所要做的就是将 VS2013 中的构建设置更改为 x64,它就可以工作了。如果您发布它,我会将其设置为答案。

标签: c++ dll visual-studio-2013 loadlibrary


【解决方案1】:

如果您的 dll 在 windows 使用的搜索路径中,请确保您没有混合 32 位和 64 位。 Windows 不会将 32 位 dll 加载到 64 位应用程序中或将 64 位 dll 加载到 32 位应用程序中。

注意:请参阅@Nard 的回答,了解 windows 如何搜索 dll:https://stackoverflow.com/a/26435819/487892)

【讨论】:

    【解决方案2】:

    由于在程序运行时加载了 DLL,因此您应该确保提供给 LoadLibrary 的 DLL 路径是相对于可执行文件,或者提供绝对路径。请参阅 MSDN 文档,了解不提供绝对路径时如何定位 DLL:

    Dynamic-Link Library Search Order

    在这种情况下,编译器将不是处理 DLL 加载的那个,因此 cpp 文件不需要定位文件,而是可执行文件需要定位文件。

    【讨论】:

    • 在问题中,您只声明 DLL 与您的 .cpp 位于同一文件夹中,因此我不能假设您的可执行文件也从同一文件夹中运行。我自己试过你的代码,它对我来说很好。
    • "即使我直接指向 dll 它仍然无法工作"
    • 很抱歉。我应该删除我的答案吗?
    猜你喜欢
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-09
    相关资源
    最近更新 更多