分类:
2006-11-29 17:07:21
checkback:
遭遇MFC系统动态链接库失效——我的一次排错经历 |
我的拙作attendance个人考勤软件在VC知识库网站()发表后,陆续有朋友来信提出一些问题,其中有一个朋友告诉我:“下载了您的个人考勤软件源码,为什么一运行就出错误”,当时因为自己没有碰到过这样的问题,答复也就不甚了了,说不到点子上。 昨天,因为又有朋友来问起,我就又翻出attendance个人考勤软件,运行了一下,结果真就遇见了“一运行就出错”的问题,下面把我遇到的情况和解决问题的过程介绍出来,可能对曾经碰到过类似问题而不知如何解决的一些朋友会有所帮助和启发。 我是在DEBUG状态编译环境下运行attendance.exe的,一运行就出错,经过几次断点运行以后发现出错点位置在CAttendanceApp类的InitInstance()函数中的以下代码行 if (RunEmbedded() || RunAutomated()) 从这儿再往下运行一步就出错,并且报出出错位置在动态链接库“Mfco42d.dll”中。然后我尝试作以下改动: 1.程序代码不加改动,把编译环境切换到Release状态下重新编译运行,结果并不出错。 2.从VC++开发平台 点击“工程-设置”菜单,弹出Project Settings对话窗口中选Win32 Debug的General选项卡,其上有Microsoft Foundation Classes列表框,点其中的下拉箭头,把原来的“Use MFC in a Shared DLL”改换成“Use MFC a Static Library”。就是把动态库改换成静态库。点“确定”退出。再重新编译运行就可不再出错。但这时查Debug目录下的attendance.exe程序文件的大小将达到2M以上。 3在“Windows资源管理器”中点选“工具-查找-文件或文件夹”菜单,在弹出的查找对话框中查找文件“Mfco42d.dll”发现是在Windows操作系统目录的System子目录下。找到这个文件并把它改名(当然要先去掉它的“只读”属性),再来运行attendance.exe程序,结果发现用上面1.2.两种方法编译出来的attendance.exe程序运行依然正常。但是在Debug状态下如果仍然采用动态库编译出来的 attendance.exe程序,运行时就会发生“找不到Mfco42d.dll文件”的错误,可见上面1.2.两种方法编译出来程序运行时不依赖于外部的Mfco42d.dll库,毛病就出在Mfco42d.dll文件上了。把它用好的来替换掉,可能会解决问题! 从Mfco42d.dll文件名判断,它不会是Windows的系统文件,而是VC++的MFC文件,找来VC++的安装光盘,一找,很幸运,它不曾被塞进打包文件而是与其它的dll文件一起存放在VC98的Debug子目录下,把它拉过来塞到Windows\System子目录下再重新编译运行,OK!全部正常。 |