MFC调试出错:Unhandled exception in 0xC0000005:Access Violation
来源:互联网 发布:centos切换输入法 编辑:程序博客网 时间:2024/06/04 17:50
最后解决通过工程-设置里重新调回“以静态库”编译
以下引用以为网友的文章,写的不错,对解决问题提供帮助
一般情况下,我们开发的MFC程序,程序一般要用到VC中关于MFC的库,其形式是.lib和对应的.dll,在工程的设置里面,project->setting->general里,有"Using MFC in a static library"或者是"Using MFC in a shared DLL",一般开发时,如果工程只是一个单独的程序,一般我们会使用"Using MFC in a static library",这样的话,编译成功后,会只有一个.exe就可以了,到了没有装MFC的机子,也可以正常用,如果不这样的话,就得把几个重要的MFC的dll和.exe放在一起才能使用,反而觉得麻烦,而且整体程序会比较大。
公司里面的项目,一般都是模块化,而且一般都是放在一起的,如果每个模块的.exe都使用"Using MFC in a static library",那样的话,整体一下,整个.exe集就会大很多,所以一般使用"Using MFC in a shared DLL"的选项,这样的话,在整体迁移到客户机的时候,就得把开发时编译使用的MFC dll都得拷贝到工程bin下面,公共使用。MFC dll一般是MFC42D.DLL,MFCANS32.DLL,MFCD42D.DLL,Mfcn42d.dll,MFCO42D.DLL。
最近在开发的时候,遇到了一个很奇怪的问题,就是我的程序在调试执行时,到了COleDateTime的方法时,都会出错,如题:“Unhandled exception in NTAutoScript.exe(MFCO42D.dll)0xC00000005:Access Violation”,COleDateTime是MFC的类,其调试也是从dll里面导出的,在网上google了一下,发现,都说什么传空指针问题,不可能嘛,因为这个工程在别的开发机器上面没事的,一到我这里rebuild了一下就有问题了,那肯定是我的机器有问题,或者是开发环境有问题了,但是现在出问题在MFC的dll上面,又不是我程序问题,肯定是调试不出问题来的了。。
后来经过我细心的对比,终于发现问题了,一般我们自己的工程编译时,如果选择"Using MFC in a static library",VC编译时,都会使用(默认路径)"C:\Program Files\Microsoft Visual Studio\VC98\MFC\Lib"这个路径下面的.lib进行编译,链接时使用系统"C:\WINDOWS\system32"路径下面相应的MFC DLL进行链接,最后我们工程里面生成的.exe只有动态链接指针,没有执行体,我是指关于MFC的api或者类。等我们的.exe执行时,才会把"C:\WINDOWS\system32"下面的MFC dll装载到内存然后根据我们程序中的api指针定位到MFC Dll里面进行执行。
但是现在为什么会出现异常呢,问题在于dll版本不一致。公司的工程bin下面以开发的程序使用的MFC DLL,我举个例子,我出错的例子,MFCO42D.dll版本是6.0.8168.0,而我现在的电脑上面装完VC后到"C:\WINDOWS\system32"一看,才发现MFCO42D.dll版本竟然是6.0.9782.0,因为.dll和.lib都是配套用的,所以如果我工程编译时,使用了版本是6.0.9782.0的.lib,那么我的程序执行时链接的.dll也必须是版本6.0.9782.0才行,所以现在我编译时使用版本6.0.9782.0,高一点,然后我的程序执行时是从程序根目录开始搜索dll的,所以使用了旧版本6.0.8168.0的,所以执行时老是提示指针错误咯,呵呵。。
现在解决的办法是,叫别的同事的机器上面的版本6.0.8168.0的.lib给我的用一下就可以了,就是路径"C:\Program Files\Microsoft Visual Studio\VC98\MFC\Lib",替换一下就可以了,编译时用旧的,程序统一使用公司bin上面的旧的.dll。
其实我们常说的VC 6.0,其实它也是有很多版本的,如VC 6.0 Sp1,VC 6.0 Sp2,...VC 6.0 Sp6,还有什么个人版,企业版的,因为升级了,所以MFC的.lib和.dll也会有改动的,所以开时,你们小组团队的使用的VC版本最好是一致的,这样问题就没有,否则可能要注意我上面所解决的问题。。
最好就是把"C:\Program Files\Microsoft Visual Studio\VC98\MFC\Lib",抽出来,放到公司工程里面,开发小组都要使用这个lib目录进行编译,就OK了,那样随便小组成员使用那个版本的VC。。。
PS:0xC0000005错误的含义程序非法访问内存,通常是指针或者句柄错误,例如指针未初始化。可以适当检查一下你的控件是怎么关联的,可以调试一下类的构造函数。
- MFC调试出错:Unhandled exception in 0xC0000005:Access Violation
- MFC调试出错:Unhandled exception in aa.exe:0xC0000005:Access Violation
- MFC 类向导添加变量出错 Unhandled exception in snmp.exe:0xC0000005:Access Violation
- 调试出错:Unhandled exception in aa.exe:0xC0000005:Access Violation
- unhandled exception in .exe :0xC0000005:Access Violation.
- unhandled exception in *.exe (MFC42D.DLL):0xC0000005:Access Violation
- Unhandled exception in XX.exe:0xC0000005:Access Violation”
- unhandled exception in XXX:0xC0000005:access violation问题
- Unhandled exception in ***.exe(OLE32.DLL):0xC0000005:Access Violation
- Unhandled exception in ***.exe(OLE32.DLL):0xC0000005:Access Violation
- Unhandled exception 0xC0000005:Access Violation
- unhandled exception in:0xC0000005:Acess Violation
- MFC 子对话框退出导致主对话框也退出的原因:Unhandled exception in xxx.exe:0xC0000005:Access Violation
- c++调试程序时出现Unhandled exception in 实验3.exe(NTDLL.DLL):0xC0000005:Access Violation
- Unhandled exception at 0x00000000 in CallDll.exe: 0xC0000005: Access violation reading location 0x00
- Unhandled exception at 0x........ in XXXX.exe: 0xC0000005:Access violation reading location 0x......
- 关于出现Unhandled exception at 0x091f11c7 in ****: 0xC0000005: Access violation reading location 0x0ab0f
- Unhandled exception at 0x007be7e0 in test.exe: 0xC0000005: Access violation writing location 0x00000
- deb仓库建立
- 关于UrlHttpConnection.setRequestProperty()的调用顺序问题的验证
- 在IE下-下载文件-文件名中文名乱码问题
- spring的第二天
- UIImagePickerController 简介
- MFC调试出错:Unhandled exception in 0xC0000005:Access Violation
- ASP.NET MVC+Spring.net+Nhibernate+EasyUI+Jquery开发案例(2)
- JDK8下载|JDK1.8下载可选择window版和linux版
- Qt学习之路(5):组件布局
- spring @RequestMapping 问题
- oracle游标全解
- Qt学习之路(6): API文档的使用
- oracle数据库性能优化 - 降低IO
- 解压和压缩