Chinaunix首页 | 论坛 | 博客
  • 博客访问: 455069
  • 博文数量: 724
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 5010
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 14:47
文章分类

全部博文(724)

文章存档

2011年(1)

2008年(723)

我的朋友

分类:

2008-10-13 17:20:48

遭遇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!全部正常。

自拙作attendance个人考勤软件发表后,我又作了一些修改,纠正了其中的错误,又对程序的功能作了进一步的完善,主要是增加了全年多页打印等功能,感兴趣的朋友可到下载!


--------------------next---------------------

楼主您好:

  我也遇到过类似问题,我要调用幾個dll(B,C,D),原代碼(A),在A中使用使用release就沒問題;debug就當機,當在文件->另存為這個地方;編譯設置為Use MFC in a Shared dll就可以沒問題,反之用靜態反而會在debug版當機,請樓主解釋一下? ( lupy0925 发表于 2006-2-25 10:00:00)
 
作者,你好:我下载了你的源程序后,无论在什么模式下都没有出错.请问为什么?我还有个不明白的问题:你是在有人向你反馈说下载了你的源程序后运行出错后才又把你的程序运行后发现错误的.我不知道当时你上传你的代码的时候难道不是在你自己的机器上编译运行确认无误后再上传的吗?而今你又重新编译了你的代码,怎么反而又出错了呢?为什么同样的代码,当时编译不出错,而现在反而出错了呢?恕小弟无知,愿闻其祥,谢谢!!! ( ckp 发表于 2004-12-25 12:28:00)
 
我在网上看到很多VC软件的作者在发布软件时都是使用的Debug方式,到后来又不得不给用户补发*D.dll链接库,看过真叫人无语啊! ( softworms 发表于 2004-8-18 13:16:00)
 
呵呵,初学者还是需要多看一些入门的文章 ( gbstar 发表于 2003-8-28 14:10:00)
 
遇到这种问题,可以先在没有安装过VC的机器上运行,看需要哪些动态库才能正常运行。 ( xiaojin 发表于 2003-8-25 15:53:00)
 
d结尾的动态库都是debug版本的程序需要用到的,在没有安装vc的机器上运行debug版本的程序是会出现错误的。因为没有debug版本的动态库。 ( adachi 发表于 2003-8-25 14:26:00)
 
.......................................................

--------------------next---------------------

阅读(255) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~