LDR: LdrpWalkImportDescriptor()解決方案

Form:http://yarin.blog.51cto.com/1130898/422187

 

今天編譯一開源項目,他提供的是VC9的工程,我這邊是VC10,首先,打開之後需要經過轉換,一切正常,然後編譯,出現一個簡單的小的錯誤,更改之後編譯通過,但是運行時出現下圖所示的錯誤。

“應用程序正常初始化(oxc0150002)”失敗,請單擊“確定”,終止應用程序。

然後再調試輸出信息中查看得到如下信息:

 

 

這種情況到時比較多見了,一般都是鏈接庫的問題,網上問這個問題的也很多,這裏就給說明一下。出錯信息說是libpng.dll的問題,那麼我們就打開這個dll來檢查一下吧。下圖是該dll的版本信息:

基本上這版本信息上也看不出什麼錯誤來,下面就只能查看該DLL的二進制信息了,打開之後,終於發現問題了,如下圖所示:

選中的部分其中包含了 “name="Microsoft.VC90.DebugCRT" version="9.0.21022.8"”,這裏的name值說明編譯該DLL是使用的VC9.0而且還是Debug版本的,而version值則是 一個版本號,還真有些鬱悶了,既然是發佈,爲什麼還要編譯Debug版本的呢?Debug版本需要環境高度一致才能兼容,release版本則不會有這些 問題存在,如何解決這個問題呢?

方法一: 卸載VC10,改裝VC9,這個比較麻煩,不考慮了。
方法二: 將對應版本的 “Microsoft.VC90.DebugCRT”拷貝到system32中,一般位於VC的安裝目錄中的redist文件夾下,如下圖所示,選中的 Debug_NonRedist(其下的x64和x86)表示是Debug版本使用的,而另外兩x64和x86則是release版本的。這裏的截圖暫時 還是VC10的,路徑爲:Microsoft Visual Studio 10.0/VC/redist/Debug_NonRedist/x86

方法三: 直接找到libpng的源代碼,自己來編譯DLL(個人比較推薦這種方式)。
因此,我們以後在發佈程序時也需要注意這樣的問題,以免出現這樣的不兼容的情況。

 

PS:方法二在Windows XP中沒有效果,拷貝在System32,對於調試版本並不能正確運行,必須拷貝到dll對應的目錄下纔可以運行。Release版本只需要安裝相應的SP1即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章