MFCO42D.dll出错——MFC系统动态链接库失效

来源:互联网 发布:电信4g网络 怎样设置 编辑:程序博客网 时间:2024/05/02 04:53

本文来自CSDN博客:http://blog.csdn.net/zhoubl668/archive/2009/03/09/3974747.aspx

 

我的拙作attendance个人考勤软件在VC知识库网站(www.vckbase.com)发表后,陆续有朋友来信提出一些问题,其中有一个朋友告诉我:“下载了您的个人考勤软件源码,为什么一运行就出错误”,当时因为自己没有碰到过这样的问题,答复也就不甚了了,说不到点子上。
昨天,因为又有朋友来问起,我就又翻出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个人考勤软件发表后,我又作了一些修改,纠正了其中的错误,又对程序的功能作了进一步的完善,主要是增加了全年多页打印等功能,感兴趣的朋友可到http://www.vckbase.com/code/viewcode.asp?id=1471下载!

 

//////////////////////////////////////////////////////////////

 

在MFC中使用OCX控件遇到的一个问题
[问题:]
在一个简单的MFC对话框中嵌入一个OCX控件(如浏览器控件),该控件采用动态方式创建,即调用CWnd::Create()接口生成窗口,在本机运行良好,但是在其它部分机器上运行则出现程序异常,报告occsite.cpp的第161行出现错误。当把源程序放到目标机器上重新编译后程序可以正常运行。以下是示例代码:
m_pFlashPlayer = NULL;  // 一个FLASH控件的对象指针
CRect rt;
GetClientRect(&rt);  //获得区域大小
if (m_pFlashPlayer = new CShockwaveFlash) {  // CShockwaveFlash由FLASH控件添加到PROJECT后 VC自动生成
 if (m_pFlashPlayer->Create("PP", WS_VISIBLE , rt, this, 0)) {  //创建窗口
  m_pFlashPlayer->SetMovie(str);
  m_pFlashPlayer->Play();
 }
}
这个问题带来的后果是如果要发布该程序到100台机器上,则必须要在100台机器上重新编译一遍程序才能正确执行。
[分析:]
经过测试,发现:
1)该问题只存在于程序DEBUG版本中,在RELEASE版本中不存在该问题。
2)该问题和MFC有关,和所嵌入的控件本身没有任何关系。
经过深入分析,发现:该问题是由于开发机和目标机使用的MFCO42D.DLL库不匹配引起的。
[结果:]
经过确认,发现开发机和目标机的运行环境有如下差异:开发机未安装任何VS补丁,MFCO42D库的File Version为6.0.8168.0, Product Version为 6.0.000,而目标机安装了VS6.0 SP5,MFCO42D库的File Version为 6.0.8665.0, Product Version为 6.0.400。
[解决:]
为确保各编码及维护人员使用的MFCO42D.DLL一致,对MFCO42D.LIB和MFCO42D.DLL进行了统一(把.lib和.dll拷贝到程序的当前路径);同时将开发机上的MFCO42D.DLL和执行程序一起发布。
[疑问:]
为何MFCO42D的高版本没有保持向下兼容?是否接口有变?

原创粉丝点击