QLibrary的load失敗(0x000000c1)


使用QLibrary可以加載動態鏈接庫,在使用的時候發現,先是調用系統的kernel32.dll沒有啥問題,調用自己寫的dll文件就有問題,加載失敗,加入查看錯誤的消息:

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

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

查看報錯為:

 報錯為0x0000000c1,似乎提供不了太多的信息……

然后我就深深滴懷疑自己了,是不是我寫的dll有問題?於是又去VS下寫了一個exe程序,在其中用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詳解

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM