MFC库文件版本对程序的影响:Unhandled exception in ***.exe(MFCO42D.dll)0xC00000005:Access Violation,但多数情况下还是对内存操作不当造成的

一般情况下,我们开发的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错误的含义程序非法访问内存,通常是指针或者句柄错误,例如指针未初始化。可以适当检查一下你的控件是怎么关联的,可以调试一下类的构造函数。

原文地址:https://www.cnblogs.com/dartagnan/p/2003609.html