编译c ++,Visual Studio时加载DLL不起作用

Posted

技术标签:

【中文标题】编译c ++,Visual Studio时加载DLL不起作用【英文标题】:Loading DLLs not working when compiled c++, Visual Studio 【发布时间】:2017-09-22 09:17:11 【问题描述】:

我正在使用加载库函数来加载 3 个 DLL。编译后的代码在 Visual Studio 中运行正常:

Picture From VS

但是当从调试文件夹运行相同的应用程序(完全相同的文件)时,它会失败:

Picture From Debug Folder

我用来加载 DLL 文件的代码在这里:

#include <Windows.h>

HMODULE dll_cmn = LoadLibrary(L"C:\\LKG5000_DLL_ver1_10\\English\\64bit\\CmnLib.dll");
HMODULE dll_drv = LoadLibrary(L"C:\\LKG5000_DLL_ver1_10\\English\\64bit\\KeyUsbDrv.dll");
HMODULE dll_if2 = LoadLibrary(L"C:\\LKG5000_DLL_ver1_10\\English\\64bit\\LKIF2.dll");

cout << "\n>> Addr dll_cmn: " << dll_cmn << endl;
cout << "   Addr dll_cmn: " << dll_drv << endl;
cout << "   Addr dll_cmn: " << dll_if2 << endl;

if (NULL != dll_cmn && NULL != dll_drv && NULL != dll_if2)

    cout << "\n>> Created .dll Handles Successfully" << endl;
    //do stuff


else

    cout << "\n>> Failed to Create .dll Handles" << endl; 

我很困惑,因为照片显示 .exe 是同一个文件夹路径中的同一个文件?

任何帮助将不胜感激!

【问题讨论】:

MCVE 在这里可能会有所帮助:***.com/help/mcve 您应该调用GetLastError 并检查返回的值。 确实如此。检查错误。不要无助。系统会告诉你失败的原因。 对不起,我应该补充一点,“成功”和“失败”来自我自己在程序中的 cout。没有错误。 您不做任何错误检查,因此您不知道系统是否报告错误。尝试阅读LoadLibrary 的文档。阅读描述返回值的部分。它告诉您使用什么值来指示失败,以及如何继续获取有关失败原因的扩展信息。这是你的下一步。 【参考方案1】:

如果可能,请重新清理并构建您的项目,然后重新运行它,使用两种方式查看结果。

我只是在我的windows 64中使用VS 2017测试它,我在VS setup文件夹中使用了三个默认的dll文件,它们在结果窗口中都成功了。如果可能的话,您可以使用我的样本在您身边进行测试。至少,我们可以知道它是否与您的VS环境或dll文件本身有关。

int main()

HMODULE dll_cmn = LoadLibrary(L"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Enterprise\\Common7\\IDE\\ReferenceAssemblies\\v4.5\\Microsoft.ExtendedReflection.dll");
HMODULE dll_drv = LoadLibrary(L"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Enterprise\\Common7\\IDE\\ReferenceAssemblies\\v4.5\\Microsoft.ExtendedReflection.Reasoning.dll");
HMODULE dll_if2 = LoadLibrary(L"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Enterprise\\Common7\\IDE\\ReferenceAssemblies\\v4.5\\Microsoft.Pex.Framework.dll");

cout << "\n>> Addr dll_cmn: " << dll_cmn << endl;
cout << "   Addr dll_cmn: " << dll_drv << endl;
cout << "   Addr dll_cmn: " << dll_if2 << endl;


if (NULL != dll_cmn && NULL != dll_drv && NULL != dll_if2)

    cout << "\n>> Created .dll Handles Successfully" << endl;
    //do stuff


else

    cout << "\n>> Failed to Create .dll Handles" << endl;


getch();
return 0;

您可以查看有关如何使用 loadlibrary 功能并获取错误消息的文档:

https://msdn.microsoft.com/en-us/library/windows/desktop/ms684175(v=vs.85).aspx

我还建议你更改dll文件夹,查看结果。或者只是使用 x84 平台并以管理员身份运行该进程。再次查看结果。

不太确定它是否是相关的依赖dll文件,但是如果任何间接链接库不可用,LoadLibrary就会失败。所以你还需要检查这些dll文件是否有任何变化。

【讨论】:

@Callum Alder,请您与我们分享您身边的最新信息吗?

以上是关于编译c ++,Visual Studio时加载DLL不起作用的主要内容,如果未能解决你的问题,请参考以下文章

加载 Visual Studio 2015 C++ 项目时出错,如何调试

Visual Studio注册表捕获实用程序已停止工作,在Windows7中编译C#项目时出错

Visual Studio 2015:在没有运行时库的情况下编译 C/C++

Visual Studio 2017在首次运行时未显示编译异常

我的全栈之路-C语言基础之Visual Studio 2019使用技巧

C ++发布程序无法在visual studio 2015中加载图像和字体