1. 程式人生 > >應用程式正常初始化失敗"-0xc0150002 解決辦法

應用程式正常初始化失敗"-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新年愉快。。 分享本身也是一種快樂。。