QT 动态加载 C++的动态链接库dll时 Unknown error 0x000000c1---运行时问题

84 篇文章 6 订阅


使用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

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值