编译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在首次运行时未显示编译异常