“应用程序无法正常启动0xc0150002” 问题分析步骤及解决方案

通常我们在Windows上使用微软的VC或VS平台开发软件。这会涉及到运行时库的选择(根据发布版本Debug/Release、ANSI/Unicode以及SingleThread/MultiThread选择不同的依赖类库),当使用MFC时还会涉及到MFC类库的连接问题(共享连接/静态连接)。

先需要了解VC中CRT,MFC的意思。CRT就是C Run-Time Library,C运行时库。MFC是Microsoft Foundation Class,微软基本类库。参见 http://www.pcw8510.com/?p=1285

http://www.cnblogs.com/chio/archive/2007/11/26/972152.html


不同版本的VS也使用了不同版本的运行时库以及MFC库。 所以某版本下不完善开发的项目转移到其他机器去运行或到其他版本的VS平台去编译运行时,可能会出问题。
比如标题中描述的这个具体问题,“ 应用程序无法正常启动0xc0150002 解决方案”!因为程序启动时并没有提示缺少某个DLL,或者其他具体信息,一开始似乎觉得无从下手。上网搜索查到对我有用的方案:

http://blog.csdn.net/debugconsole/article/details/7870015

http://lixinyiabc123.blog.163.com/blog/static/140977406201022803210261/


再看我依照这些资料分析问题的过程:

1,使用“我的电脑”->“管理”->“事件查看器"->“系统”,查看系统反馈信息。目测在XP下无具体信息

2,因为我在某台机子上可以正确运行(这一般需要知道程序原来是在哪个VS版本下开发的)。从VS平台下启动程序,会在输出栏显示程序启动的相关信息,比如加载资源,DLL之类的。我对比了不同版本下启动的详细信息,结果如下:


正常启动的版本:
“Campic.exe”: 已加载“E:\wsc\swDevBoard\Campic\Debug\Campic.exe”,已加载符号。
“Campic.exe”: 已加载“C:\WINDOWS\system32\ntdll.dll”
“Campic.exe”: 已加载“C:\Program Files\AVAST Software\Avast\snxhk.dll”
“Campic.exe”: 已加载“C:\WINDOWS\system32\kernel32.dll”
“Campic.exe”: 已加载“E:\wsc\swDevBoard\Campic\Debug\cximaged.dll”
“Campic.exe”: 已加载“C:\WINDOWS\WinSxS\x86_Microsoft.VC90.DebugMFC_1fc8b3b9a1e18e3b_9.0.30729.1_x-ww_c94a3a24\mfc90d.dll”
“Campic.exe”: 已加载“C:\WINDOWS\WinSxS\x86_Microsoft.VC90.DebugCRT_1fc8b3b9a1e18e3b_9.0.30729.1_x-ww_f863c71f\msvcr90d.dll”
“Campic.exe”: 已加载“C:\WINDOWS\system32\user32.dll”
“Campic.exe”: 已加载“C:\WINDOWS\system32\gdi32.dll”
“Campic.exe”: 已加载“C:\WINDOWS\system32\shlwapi.dll”
“Campic.exe”: 已加载“C:\WINDOWS\system32\advapi32.dll”
“Campic.exe”: 已加载“C:\WINDOWS\system32\rpcrt4.dll”
“Campic.exe”: 已加载“C:\WINDOWS\system32\secur32.dll”
“Campic.exe”: 已加载“C:\WINDOWS\system32\msvcrt.dll”
“Campic.exe”: 已加载“C:\WINDOWS\system32\comctl32.dll”
“Campic.exe”: 已加载“C:\WINDOWS\system32\msimg32.dll”
“Campic.exe”: 已加载“C:\WINDOWS\system32\oleaut32.dll”
“Campic.exe”: 已加载“C:\WINDOWS\system32\ole32.dll”
“Campic.exe”: 已加载“C:\WINDOWS\WinSxS\x86_Microsoft.VC90.DebugCRT_1fc8b3b9a1e18e3b_9.0.30729.1_x-ww_f863c71f\msvcp90d.dll”
“Campic.exe”: 已加载“C:\WINDOWS\system32\ws2_32.dll”
“Campic.exe”: 已加载“C:\WINDOWS\system32\ws2help.dll”
“Campic.exe”: 已加载“E:\wsc\swDevBoard\Campic\Debug\avcodec-53.dll”,未使用调试信息生成二进制文件。
“Campic.exe”: 已加载“E:\wsc\swDevBoard\Campic\Debug\avutil-51.dll”,未使用调试信息生成二进制文件。
“Campic.exe”: 已加载“E:\wsc\swDevBoard\Campic\Debug\swscale-2.dll”,未使用调试信息生成二进制文件。
“Campic.exe”: 已加载“E:\wsc\swDevBoard\Campic\Debug\avformat-53.dll”,未使用调试信息生成二进制文件。
“Campic.exe”: 已加载“C:\WINDOWS\system32\avifil32.dll”
“Campic.exe”: 已加载“C:\WINDOWS\system32\winmm.dll”
“Campic.exe”: 已加载“C:\WINDOWS\system32\msacm32.dll”
“Campic.exe”: 已加载“C:\WINDOWS\system32\msvfw32.dll”
“Campic.exe”: 已加载“C:\WINDOWS\system32\shell32.dll”
“Campic.exe”: 已加载“E:\wsc\swDevBoard\Campic\Debug\hsPlayer.dll”,已加载符号。
“Campic.exe”: 已加载“E:\wsc\swDevBoard\Campic\Debug\hsCamera.dll”,已加载符号。
“Campic.exe”: 已加载“E:\wsc\swDevBoard\Campic\Debug\cximagedu.dll”
“Campic.exe”: 已加载“C:\WINDOWS\WinSxS\x86_Microsoft.VC90.DebugMFC_1fc8b3b9a1e18e3b_9.0.30729.1_x-ww_c94a3a24\mfc90ud.dll”
“Campic.exe”: 已加载“E:\wsc\swDevBoard\Campic\Debug\PR_Dll.dll”
“Campic.exe”: 已加载“C:\WINDOWS\system32\imm32.dll”
“Campic.exe”: 已加载“C:\WINDOWS\system32\lpk.dll”
“Campic.exe”: 已加载“C:\WINDOWS\system32\usp10.dll”
“Campic.exe”: 已加载“C:\WINDOWS\system32\uxtheme.dll”
“Campic.exe”: 已加载“C:\WINDOWS\WinSxS\x86_Microsoft.VC90.MFCLOC_1fc8b3b9a1e18e3b_9.0.30729.4148_x-ww_15fc9313\mfc90chs.dll”,未使用调试信息生成二进制文件。
“Campic.exe”: 已加载“C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.6028_x-ww_61e65202\comctl32.dll”
“Campic.exe”: 已加载“C:\WINDOWS\system32\MSCTF.dll”
“Campic.exe”: 已加载“C:\WINDOWS\system32\version.dll”
“Campic.exe”: 已卸载“C:\WINDOWS\system32\version.dll”
“Campic.exe”: 已加载“C:\WINDOWS\system32\msctfime.ime”
Warning: initial dialog data is out of range.


无法启动的版本:
“Campic.exe”(Win32): 已加载“D:\camera\Campic3\Debug\Campic.exe”。已加载符号。
“Campic.exe”(Win32): 已加载“D:\Windows\System32\ntdll.dll”。无法查找或打开 PDB 文件。
“Campic.exe”(Win32): 已加载“D:\Windows\System32\kernel32.dll”。已加载符号。
“Campic.exe”(Win32): 已加载“D:\Windows\System32\KernelBase.dll”。已加载符号。
“Campic.exe”(Win32): 已加载“D:\camera\Campic3\Debug\cximaged.dll”。无法查找或打开 PDB 文件。
“Campic.exe”(Win32): 已加载“D:\Windows\System32\ws2_32.dll”。已加载符号。
“Campic.exe”(Win32): 已加载“D:\camera\Campic3\Debug\avcodec-53.dll”。模块已生成,不包含符号。
“Campic.exe”(Win32): 已加载“D:\camera\Campic3\Debug\swscale-2.dll”。模块已生成,不包含符号。
“Campic.exe”(Win32): 已加载“D:\camera\Campic3\Debug\avformat-53.dll”。模块已生成,不包含符号。
“Campic.exe”(Win32): 已加载“D:\camera\Campic3\Debug\avutil-51.dll”。模块已生成,不包含符号。
“Campic.exe”(Win32): 已加载“D:\camera\Campic3\Debug\hsCamera.dll”。已加载符号。
“Campic.exe”(Win32): 已加载“D:\camera\Campic3\Debug\hsPlayer.dll”。已加载符号。
“Campic.exe”(Win32): 已加载“D:\Windows\System32\mfc110d.dll”。已加载符号。
“Campic.exe”(Win32): 已加载“D:\Windows\System32\msvcr110d.dll”。已加载符号。
“Campic.exe”(Win32): 已加载“D:\Windows\System32\user32.dll”。已加载符号。
“Campic.exe”(Win32): 已加载“D:\Windows\System32\gdi32.dll”。已加载符号。
“Campic.exe”(Win32): 已加载“D:\Windows\System32\comctl32.dll”。已加载符号。
“Campic.exe”(Win32): 已加载“D:\Windows\System32\oleaut32.dll”。已加载符号。
“Campic.exe”(Win32): 已加载“D:\Windows\System32\msvcp110d.dll”。已加载符号。
“Campic.exe”(Win32): 已加载“D:\camera\Campic3\Debug\PR_Dll.dll”。无法查找或打开 PDB 文件。
“Campic.exe”(Win32): 已加载“D:\Windows\System32\advapi32.dll”。已加载符号。
程序“[2632] Campic.exe”已退出,返回值为 -1072365566 (0xc0150002)。

对比后发现启动失败的原因是没有加载那几个CRT运行库以及MFC共享库,可以认为是现有系统不具有原始程序所依赖的库的版本!

3.使用VC的工具Depends(Dependence Walker)可以查看可执行模块依赖的链接库。如果标有黄色标记,表示模块所在目录下缺少相应的DLL。如果系统中也缺少这些文件,那么程序是无法执行的。故在系统中搜索缺乏的dll(这里推荐使用一个搜索软件,叫Everything,根据文件名搜索文件的最好软件)。如果没有,需要从其他机器上拷贝到程序目录下,或者安装vcredist.exe来向系统添加这些不同版本的库。

至此我的问题已解决!!!


最后给出其他人的两篇总结,用以学习使用VS2008开发程序的部署方法

http://blog.csdn.net/jtop0/article/details/6933212

http://oliver258.blog.51cto.com/750330/411797

你可能感兴趣的:(技术摘录)