記一次LoadLibrary Error 127錯誤的問題排查

在Windows技術開發中,DLL插件加載技術是我們經常會用到的。

記一次LoadLibrary Error 127錯誤的問題排查

維護我司之前的老代碼,更換自己修改後的DLL插件後,exe加載過程中Log一直打印LoadLibrary Error,GetLastError()打印的錯誤碼是127,查看MSDN,該錯誤碼對應的含義是已經找到了需要查找的DLL,但是不是正確的版本

此時,有點犯暈了,不是正確的DLL版本,再次確認了下生成的DLL名稱,VS的編譯屬性,確認沒有問題,可就是一直在LoadLibrary處發生錯誤,在沒有相應exe代碼無法調試的情況下,只能自己動手豐衣足食了。

將自己新編譯的DLL和原始安裝包中的DLL做對比,看看到底有什麼不一樣,這個時候就用到了dumpbin.exe 這款工具來查看兩個DLL的導出函數具體有什麼不同。設計到源代碼隱私,這裡省略原始截圖,只是說明下該工具的用法。

dumpbin.exe是VS自帶的工具,在VS安裝目錄下可以找到(Microsoft Visual Studio 12.0\Common7\Tools\Shortcuts)(PS:對應版本為VS2013)

具體使用幫助如下:

記一次LoadLibrary Error 127錯誤的問題排查

需要查看某個具體DLL導出函數時,只需要執行下列命令:

dumpbin –exports xxx.dll

當然,為了對比方便,我們可以將其輸出利用管道技術重定向到文本文檔中。

dumpbin –exports xxx.dll > dumpbin.log

緊接著使用神奇`beyond compare`對比這兩個log文檔,就可以發現兩個不同DLL版本之間的區別了。

通過最後的排查,發現新版本的DLL文件增加的功能需要調用公共庫中的一個新函數,而替換DLL文件時,並未對該common.dll進行替換,導致出錯。謹以此文作為記錄。


分享到:


相關文章: