使用QT 动态调用c++的动态链接库时,加载动态链接库时出现句柄是NULL的情况

前提:qt 64位,debug模式,且一直是这个模式;
dll为64位的,由vs2010编写

尝试1:路径问题?

HMODULE m_hModule = LoadLibrary(sFullPath);
DWORD dd = GetLastError();

发现m_hModule =NULL 时 一开始怀疑sFullPath 路径有问题,后来输出来发现没问题。

最后 使用绝对路径时也是出现 为=NULL

尝试2: DLL缺少依赖库?

已经将DLL对应的库放在bin文件夹下,同时也放在了pro文件夹下。

是不缺少依赖库的

尝试3: 难道QT 不能直接调用C++ 的动态链接库?

qt中用了opencv 这个库也是c++ 的,也能直接用啊

说明不是这个问题。

后来知道了,qt 64位的debug 不能直接调用32位的debug c++的动态链接库dll

尝试4:是否dll 的位数不对?

由于QT是64位 debug 后来怀疑是不是dll的位数不对

使用dumbin.exe查看 该dll 确实是 64位, DLL的位数确实没问题。

尝试5:后来使用QT自带的加载库## 标题QLibrary module(“F://workspace//zhant//bin//zhant_d.dll”);
bool bret = false;
bret = module.load();
qDebug()<<module.errorString();

发现bret为false ,输出错误信息,
module.errorString()输出信息为:

Cannot load library F://workspace//zhant//bin//zhant_d.dll: Unknown error 0x000000c1

最后上网上搜索

http://www.chilkatforum.com/questions/1590/regsvr32-loadlibrary-failed-getlasterror-returns-0x000000c1

QLibrary的load失败(0x000000c1) - castor_xu - 博客园 (cnblogs.com)

看到这篇博客,想调用release的dll

尝试6:QT 调用release版本的dll

将load时路径改为release的dll后,发现 LoadLibrary的句柄不为空了,而且 自带的库load 也成功了。

QT 64位的debug 能调用 64位的debugDLL, 也能调用64位的release模式的dll。 (如果想调用32位的dll要整的很麻烦。参考这个:

64位进程调用32位DLL详解_聂炳玉的博客-CSDN博客_64位程序调用32位dll)

debug版本带运行时问题,release版本不带运行时问题

最后7: 问题应该出现在C++ dll 与qt 的运行时问题

dll 是用vs2010 写的 64位程序,我的qt 是msvc2017 x64, 如果我想直接用的话,只能调用release 版本的,debug版本带运行时。

也可以用vs2017再对 vs2010版本的dll 进行多一次封装,然后qt再调用

问题8: 运行时问题

QT 将 dll 加载成功后,运行了两个函数后,调用真正的算法时发现异常。
最后发现是opencv的版本问题。

QT msvc2017 X64 、 opencv2.4.13 的版本

但算法的dll是vs2010 x64 opencv2.4.3的版本
opencv2.4.3最高支持vs2010, 不支持2017,所以
要将算法的opencv改为2.4.13

同时,后期要将vs2010改为2017版本比较好。

在调试时可用GetLastError() 或者 module.errorString() 输出异常信息

GetLastError()返回值列表_coder i++的博客-CSDN博客_getlasterror
https://blog.csdn.net/weixin_53370274/article/details/123307522

CSDN-Ada助手: 亲爱的博主,我真心想说您的创作真的不易,您在《duilib中使用mfc控件》这篇博客中展示了您对于mfc控件在duilib中的应用的独到见解,让我受益匪浅。 鉴于您对于duilib和mfc的深入理解,我非常期待您下一篇博客的创作。或许可以以“探索duilib与Qt集成开发的实践与思考”为题,探讨在使用duilib时与Qt框架的融合与互补,分享您对于这个话题的经验和观点。这不仅对于duilib和Qt开发者们来说会是一场精彩的思维碰撞,也会让更多人受益于您的知识分享。 期待在未来能继续看到您的优质创作!加油! QT中 :-1: error: Failed to resolve include /moc_predefs.h“ for moc file 自从学了C语言后发际线不保: 感谢作者! VS2019企业版密钥 consider_it_done: 没毛病,烙铁! Duilib→控件占位符 开心大爆炸: Duilib→控件占位符 lwei2: 表情包 多谢大佬。