ATL的对话框与MFC的对话框兼容性问题

SimonXie 2003-04-30 09:36:27
我有一个支持MFC的ATL的COM工程,工程中要调用到另外一个MFC的DLL,这个MFC DLL 中包含了一个MFC的对话框(CDialog),当我在COM工程中调用些DLL时,当程序运行到MFC DLL中的对话框创建的代码时便会出错。
后来我跟踪了一下,发现出错的函数可能是AfxGetResourceHandle 之类的函数。
这个问题很难解决,因为我不能去修改原来的MFC DLL。
各位兄弟姐妹,不知道是否有人遇到和我相似的情况呢?能否帮忙想一下解决的办法呢?

因为这帖最多只能给100分,如果帮我解决了问题,我会开另外一张帖给分你们的
...全文
52 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
baizhanhua 2003-06-19
  • 打赏
  • 举报
回复

//from zhp80(zhp80)
//问题可能出在这
//Note If your dialog box is derived from CAxDialogImpl , it can host both
//ActiveX and Windows controls. If you don’t want the overhead of ActiveX
//control support in your dialog box class, use CSimpleDialog or CDialogImpl
//instead.
//---msdn
//这是ATL dialog的特点,而那个WINAPI DLL中的对话框创建的代码肯定不能满足


同意zhp80(zhp80)的看法

下面给出一个简单示例
First, create a dialog based class

1 Add head files including

#include <atlhost.h>
// needed for NM_CLICK, etc
#include <commctrl.h>

2 chang your class like this

class Cxxx : public CAxDialogImpl<Cxxx>
{
....
enum { IDD = IDD_MYDIALOG };

3 add message map
BEGIN_MSG_MAP(Cxxx)
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
COMMAND_ID_HANDLER(IDOK, OnOK)
COMMAND_HANDLER(...)
COMMAND_CODE_HANDLER(...)
NOTIFY_HANDLER(...)
NOTIFY_ID_HANDLER(...)
NOTIFY_CODE_HANDLER(...)
END_MSG_MAP()

4 Add your specialized code

LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
return 1;
}

LRESULT OnOK(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
EndDialog(wID);
return 0;
}
LRESULT xxx(xxx, ... )
{
.....
}




xiaobo 2003-06-18
  • 打赏
  • 举报
回复
我好象记得只有STA的组件能和MFC界面交互!
SimonXie 2003-06-18
  • 打赏
  • 举报
回复
UP
SimonXie 2003-06-03
  • 打赏
  • 举报
回复
UP
dingyy 2003-06-03
  • 打赏
  • 举报
回复
严肃求实 我 up
zhp80 2003-06-03
  • 打赏
  • 举报
回复
问题可能出在这
Note If your dialog box is derived from CAxDialogImpl , it can host both ActiveX and Windows controls. If you don’t want the overhead of ActiveX control support in your dialog box class, use CSimpleDialog or CDialogImpl instead.
---msdn
这是ATL dialog的特点,而那个WINAPI DLL中的对话框创建的代码肯定不能满足
至于怎么解决,我不会

建议
1.取微软新闻组问问,那的水平高多了,尤其是英文组
2.把你的WINAPI DLL的.h 与 你的调用代码贴出来,大家讨论讨论

另外
有了答案别忘了把方法告诉我们
SimonXie 2003-06-02
  • 打赏
  • 举报
回复
UP
SimonXie 2003-06-01
  • 打赏
  • 举报
回复
winthegame(120斤重的大青蛙)

很多谢你的回答,但我不知道你是否做过了测试。
你的DLL用在普通的程序中是没有总是的,但如果你用在COM的程序中是会有问题的。
不信的,你可以跟踪一下当,程序运行到
AfxSetResourceHandle
此类的函数时,程序会报一个非法操作的错误出来。
就算你是不使用有资源的对话框,如使用CWnd类,调用Create时一样也会出现非法操作。

有些东西不是想当然就行了,要通过实际的测试才能证明它是否能运行。
streamby 2003-05-26
  • 打赏
  • 举报
回复
up

偶也遇过类似的问题!我觉得主要是句柄的问题!!!!!
winthegame 2003-05-26
  • 打赏
  • 举报
回复
不明白就是不明白,何必如此火气呢?你问问题先来个这里人都是弱智吗?怎么连偶的问题答不出来呢?又有多少朋友愿意留言呢? 算了,不多争,做技术研究吧。

转贴
当你在 DLL 中使用资源时,有些小细节需要注意。首先,在 DLL 运行时,必须保存 DLL 的实例,可以通过 AfxInitExtensionModule。

static AFX_EXTENSION_MODULE extensionDLL;

extern "C" int APIENTRY DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
// Extension DLL one-time initialization
if (!AfxInitExtensionModule(extensionDLL, hInstance))
return false;
}

return(true);
}

然后,每次使用 DLL 资源时,你必须改变资源的句柄,使其指向 DLL,并保存 exe 的资源,以便以后正确恢复。

void get_DLL_resource(void)
{
/* this function changes the resource handle to that of the DLL */
//这个函数改变资源句柄使其指向DLL
if (resource_counter == 0)
{
save_hInstance = AfxGetResourceHandle();
AfxSetResourceHandle(extensionDLL.hModule);
}

resource_counter++;
}

接着你需要其它函数来恢复资源句柄:

void reset_DLL_resource(void)
{
/* this function restores the resource handle set by
'get_DLL_resource()' */

if (resource_counter > 0)
resource_counter--;

if (resource_counter == 0)
AfxSetResourceHandle(save_hInstance);
}

接下来一点非常重要,只要有可能就必须恢复资源句柄,否则,你将会遇到许多问题。原因是可执行文件必须重画工具条等等,比如说,如果用户移动 DLL 的对话框,如果资源句柄仍然为 DLL 的资源,程序就崩溃了,我发现最好恢复句柄的时机在对话框的 OnInitDialog() 中,这时对话框的模板等已经读出了。

希望对你有帮助。
SimonXie 2003-05-26
  • 打赏
  • 举报
回复
1万年前就有人解决了?
都不知道你有没有眼睛的。
你自己再看看
winthegame 2003-05-23
  • 打赏
  • 举报
回复
1万年前就有人解决了, 可能是太简单了吧... 使用
void AfxSetResourceHandle( HINSTANCE hInstResource ); 指向你要调用的DLL,
用完在设置回来。
因为默认的情况下,你的程序只会在自己的资源里面找这个资源,当然会出错。
SimonXie 2003-05-23
  • 打赏
  • 举报
回复
UP
SimonXie 2003-05-20
  • 打赏
  • 举报
回复
UP
SimonXie 2003-05-19
  • 打赏
  • 举报
回复
UP
originalEvil 2003-05-16
  • 打赏
  • 举报
回复
我的毕设要做这个,不会,求救!
SimonXie 2003-05-16
  • 打赏
  • 举报
回复
一笑而过:
你说的可能有道理。。

但这可能实现不了呀
nokialiu 2003-05-15
  • 打赏
  • 举报
回复
我认为主要是ATL内部隐藏的消息循环机制和MFC窗口的消息机制不一样造成的,你必须想办法将它们的消息传递连接起来。
SimonXie 2003-05-12
  • 打赏
  • 举报
回复
UP
SimonXie 2003-05-09
  • 打赏
  • 举报
回复
UP
加载更多回复(12)

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧