"應用程序正常初始化失敗"-0xc0150002 解決辦法

---前言:

畢業設計用OpenCV了庫最完後,最終發佈,在其它人的電腦上運行時,出現了這個

0xc0150002的錯誤,終於找到了正確的方法,並解決之。。。

如下:

最近幾天被這個問題困惑了許久。 不禁感嘆微軟的東東真是越做越爛了,也終於明白了時隔12年大家仍然死守VC6的原因。。 

  用VC2005編譯的程序,編譯時沒有任何錯誤,但是運行時就是提示“應用程序正常初始化失敗”!! 查找了各方面資料,做了各種嘗試,網上說什麼的都有:有讓安裝vc2005 sp1補丁的;有讓安裝vcredist_x86.exe的; 有讓把CRT庫的dll直接拷貝到程序目錄的; 有讓清理註冊表的;有讓裝.NetFramework新版本的;有讓查manifest的; 

  結果我嘗試了半天,幾乎都是浪費時間。上面最後一條說的還算正確,只是作者把事情描述得太繁瑣了。。現在把處理的方法說一下,省得大家再走彎路: 

  1. VC2003、VC2005、VC2008及其後續版本,對底層最基本的CRT、MFC、ATL庫都進行了重構,爲了避免不同版本的庫引起衝突,重構後的庫文件一般放在 C:\\windows\WinSxS 文件夾中,並用特定的文件夾\文件名稱進行標識; 

  2. 與VC6不同, VC2003、VC2005、VC2008及其後續版本,引入了manifest清單的概念,即應用程序編譯後會同時生成對應的.manifest文件,並將該.manifest文件作爲資源編譯到dll或者exe中去。.manifest文件實際上是一個XML格式的文本文件,裏面記錄了dll或exe中要引用的CRT、MFC、ATL庫的版本和名稱。VC6編譯的應用程序對CRT、MFC、ATL的dll都是直接調用,而VC2003、VC2005、VC2008編譯的程序都是先查詢編譯到資源中的manifest中的記錄,然後按照記錄提供的版本和名稱去搜尋對應的CRT、MFC、ATL庫以及隨庫發佈的.manifest文件,搜尋的路徑包括當前目錄、C:\\windows\WinSxS 等等,如果沒有找到對應的庫文件,則提示“應用程序正常初始化失敗”; 

  3.因此解決這個問題的辦法就是:(a)用文本編輯器打開exe或dll對應的.manifest文件,查看它引用的CRT、MFC、ATL庫的版本;或者,用UltraEdit直接打開exe或者dll,從資源區中找到編譯進去的.manifest信息,找到它引用的CRT、MFC、ATL庫的版本;或者,運行程序,當程序彈出“應用程序正常初始化失敗”對話框時,在桌面上右鍵點擊“我的電腦”-“管理”-“事件查看器”-“系統”,雙擊查看其中的記錄,可以看到出錯的原因是因爲缺少了某某版本的CRT、MFC、ATL庫,記錄下這個版本信息;(b)記錄到的庫的版本信息一般類似於“Microsoft.VC90.DebugCRT”,之後到C:\\windows\WinSxS 或者VC200X的安裝文件夾中搜索包含這個字符串的文件夾和文件,將搜索到的dll和.manifest文件都拷貝到應用程序所在的文件夾中,其中,.manifest文件必須重命名爲“Microsoft.VC90.DebugCRT.manifest”(這裏以Microsoft.VC90.DebugCRT爲例),這樣應用程序就可以正常運行了;(c)注意:庫的.manifest文件和dll要一同拷貝到應用程序根目錄去,因爲應用程序會將編譯到內部的manifest信息與外部的.manifest文件進行對比,之後纔會對庫的dll進行調用。如果只拷貝庫的dll文件是沒有用的; 

  4.如果本機編譯和運行程序都ok,但是將編譯好的程序拿到其它機器上確無法運行,則多半也是這個原因。另外,如果提示"應用程序配置不正確",大多也是因爲上面所說的CRT、MFC、ATL庫版本與應用程序不匹配導致的,可以如法炮製進行解決; 

  好了,就這些。。快過年了,祝everyone新年愉快。。 分享本身也是一種快樂。。

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