返回   cpper编程论坛 > C/CPP/TMP/GP
注册账号 论坛帮助 会员列表 日历事件 搜索 今日新帖 标记版面已读

回复
 
LinkBack 主题工具 显示模式
  #1 (permalink)  
旧 2005-06-13
高级会员
 
注册日期: 2003-11-19
帖子: 265
我要自由 正向着好的方向发展
默认 vc 中扩展DLL的release版不能在debug exe程序中用?

写了一个扩展DLL,此DLL内有对话框等资源。用时发现client如果和DLL的版本一样(同为release 或同为debug),一切正常,如果不一样,就会出错,是怎么会事啊?
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #2 (permalink)  
旧 2005-06-13
wy 的头像
wy wy 当前离线
高级会员
 
注册日期: 2004-03-17
帖子: 518
wy 正向着好的方向发展
默认

函数名不一样吧
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #3 (permalink)  
旧 2005-06-13
高级会员
 
注册日期: 2003-11-19
帖子: 265
我要自由 正向着好的方向发展
默认

是一样的,因为都是VC编译器;忘了说了是运行到调用dll的导出函数(或类)时出错,不是连接或启动时出错。

问了一下同事,他们说也遇到过类似的情况!

试了一下,如果dll不包含资源就不会这样,是不是不能这样直接引用资源啊?
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #4 (permalink)  
旧 2005-06-13
高级会员
 
注册日期: 2002-10-06
帖子: 178
famel 正向着好的方向发展
默认

你有没有在dll里申请内存然后在exe里释放的情况(或者反之)?有些情况是非常隐晦的(例如智能指针)。RELEASE和DEBUG使用不同的CRT,有没有可能你的资源在DLL里被申请然而在EXE里被释放?这样肯定会出错的。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #5 (permalink)  
旧 2005-06-15
高级会员
 
注册日期: 2003-11-19
帖子: 265
我要自由 正向着好的方向发展
默认

用很简单的例子,在dll加入对话框资源,生成对应的类CTest,导出类CExtenDllTest,调用其静态成员Test()
[/code]
void CExtenDllTest::Test()
{
CTest dlg;
dlg.DoModal();
}
[/code]
调试中发现,如果dll 是debug,应用程序是release时,dll得到的资源句柄为NULL
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #6 (permalink)  
旧 2005-06-16
高级会员
 
注册日期: 2002-10-06
帖子: 178
famel 正向着好的方向发展
默认

如果这样的话也就是说你的exe和dll有可能在一个进程里使用不同版本的MFC DLL,我好像记得这是不允许的。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #7 (permalink)  
旧 2005-06-16
高级会员
 
注册日期: 2003-11-19
帖子: 265
我要自由 正向着好的方向发展
默认

常规dll是可以的。
扩展dll能使用不同版本的MFC DLL是因为扩展DLL将DLL的资源与EXE的资源链结在一起吧?
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #8 (permalink)  
旧 2005-06-16
高级会员
 
注册日期: 2002-10-06
帖子: 178
famel 正向着好的方向发展
默认

从你的代码来看你的DLL使用了MFC,如果这个DLL是MFC扩展DLL的话它只能动态链接MFC71.DLL,也就意味着你的程序也必须使用MFC71.DLL。MFC扩展DLL在DllMain里有代码将其注册到MFC资源链里,并且你要在该DLL的每一个输出函数的最前面使用AFX_MANAGE_STATE宏来切换当前资源句柄。如果EXE和DLL使用不同的BUILD,那么意味着同一个进程里存在MFC71.DLL和MFC71D.DLL,实在是难以预料会发生什么事情。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #9 (permalink)  
旧 2005-06-17
高级会员
 
注册日期: 2003-11-19
帖子: 265
我要自由 正向着好的方向发展
默认

引用:
作者: famel
从你的代码来看你的DLL使用了MFC,如果这个DLL是MFC扩展DLL的话它只能动态链接MFC71.DLL,也就意味着你的程序也必须使用MFC71.DLL。MFC扩展DLL在DllMain里有代码将其注册到MFC资源链里,并且你要在该DLL的每一个输出函数的最前面使用AFX_MANAGE_STATE宏来切换当前资源句柄。如果EXE和DLL使用不同的BUILD,那么意味着同一个进程里存在MFC71.DLL和MFC71D.DLL,实在是难以预料会发生什么事情。
应该是这样了。
不过扩展DLL好象不用AFX_MANAGE_STATE切换资源句柄吧?可能就是因为MFC71.DLL和MFC71D.DLL对同一个资源句柄操作产生的问题。如使用常规DLL即使有两套MFCXX.dll,也不会有问题,因为EXE与DLL的资源是分开的,调用DLL的导出函数时只要用AFX_MANAGE_STATE切换资源句柄就可以了。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
回复

书签

主题工具
显示模式

发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛启用 表情符号
论坛启用 [IMG] 代码
论坛禁用 HTML 代码
Trackbacks are 启用
Pingbacks are 启用
Refbacks are 启用



所有时间均为格林尼治时间 +9。现在的时间是 07:18 AM


Powered by vBulletin® 版本 3.7.0
版权所有 ©2000 - 2009,Jelsoft Enterprises Ltd.
(C) Copy Right All Right Reserved 2001 - 2007

Search Engine Friendly URLs by vBSEO 3.1.0