码迷,mamicode.com
首页 > 其他好文 > 详细

QLibrary的load失败(0x000000c1)

时间:2020-02-24 23:48:23      阅读:489      评论:0      收藏:0      [点我收藏+]

标签:tps   系统   ast   开始   load   art   链接库   情况下   src   

使用QLibrary可以加载动态链接库,在使用的时候发现,先是调用系统的kernel32.dll没有啥问题,调用自己写的dll文件就有问题,加载失败,加入查看错误的消息:

    QLibrary lib("Project1.dll");
    lib.load();

    if(!lib.isLoaded())
    {
        QMessageBox::information(this,"bad",lib.errorString());
        return;
    }

查看报错为:

技术图片

 然后我就深深滴怀疑自己了,于是又去VS下写了一个程序,用LoadLibrary去加载这个Project1.dll, 程序运行完好,啥问题都没有……

然后换个思路,在Qt下面用LoadLibrary不用QLibrary加载试试?还是加载失败,GetLastError报错为6,查查看意思是句柄无效,似乎啥都没说。

这就让我很蛋疼了,看来问题出在Qt这边。

然后就是各种搜索加载失败的问题,然后直接把错误码都丢到百度里面去检索,功夫不负有心人:

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

灵机一动,是不是因为32位和64位的问题?既然Qt程序使用的是64位的MinGW,那就都统一为x64平台试试?

有方向就好办了,由于这个dll是一个demo程序,我有源码,把目标平台换成x64,编译,运行,OK了。

技术图片

 

 总结:

因为一开始编译的dll是32位,但是64位进程直接调用32位DLL是会失败的,所以加载不成功,反过来,32位的进程去调用64位的DLL一样会失败,只有都统一起来以后才没问题了。

在没有dll源码的情况下,没法重新编译,这个时候就需要突破32位和64位之间调用的问题了,关于这个问题,可以参考这个:

64位进程调用32位DLL详解

 

QLibrary的load失败(0x000000c1)

标签:tps   系统   ast   开始   load   art   链接库   情况下   src   

原文地址:https://www.cnblogs.com/castor-xu/p/12359561.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!