COM中CWnd或其它窗口类型不能使用消息

Crob 2006-05-11 08:46:43
在一个COM组件中,有一个CWnd窗口,在里面定义了自定义消息,但是在COM中无论是PostMessage还是SendMessage,该窗口都收不到这个消息。在外面使用这个CWnd类都是好用的,一放到COM中就收不到消息了。

另外调用COM组件的是控制台程序,CWnd用如下方法创建:
另外我还试过ATL的Window模板类,也不能使用消息。

WNDCLASSEX wndclass;
wndclass.cbSize=sizeof wndclass;
wndclass.style=0;
wndclass.lpfnWndProc=WindowProc;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hInstance=GetModuleHandle(0);
wndclass.hIcon=0;
wndclass.hCursor=0;
wndclass.hbrBackground=0;
wndclass.lpszMenuName=0;
wndclass.lpszClassName=_T("Helper Window");
wndclass.hIconSm=0;

RegisterClassEx(&wndclass);
m_hWnd=CreateWindow(_T("Helper Window"), _T("Helper Window"), 0, 0, 0, 0, 0, 0, 0, 0, GetModuleHandle(0));
...全文
233 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Crob 2006-05-13
  • 打赏
  • 举报
回复
结贴,请各位再次关注这个贴子!

http://community.csdn.net/Expert/topic/4749/4749761.xml?temp=.7357447
Crob 2006-05-12
  • 打赏
  • 举报
回复
pWnd是CWnd的指针,在COM内有效的指针。

什么是COM calles ?
蒋晟 2006-05-12
  • 打赏
  • 举报
回复
How did you get pWnd?
try to use COM calles instead of sending messages
Crob 2006-05-12
  • 打赏
  • 举报
回复
pWnd->PostMessage(WM_USER, 0, 0);
::PostMessage(pWnd->m_hWnd, WM_USER, 0, 0);
::PostMessage(pWnd->GetSafeHwnd(), WM_USER, 0, 0);

pWnd->SendMessage(WM_USER, 0, 0);
::SendMessage(pWnd->m_hWnd, WM_USER, 0, 0);
::SendMessage(pWnd->GetSafeHwnd(), WM_USER, 0, 0);

以上几种SEND MESSAGE方法都接收不到,但是如果不是在COM中使用这个CWnd,就全可以收到。

另外需要提的是,如果使用SendMessage,会在SendMessage语句处阻塞掉,因为在等待返回。

有谁有这样的经验吗?谢谢!
蒋晟 2006-05-12
  • 打赏
  • 举报
回复
BTW, how did you send your message?
蒋晟 2006-05-11
  • 打赏
  • 举报
回复
where is your messgae pump?
lion_wing 2006-05-11
  • 打赏
  • 举报
回复
不会吧,什么样的代码?
CWnd类提供了微软基础类库所有窗口类的基本功能。 CWnd对象与Windows的窗口不同,但是两者有紧密联系。CWnd对象是由CWnd的构造函数和析构函数创建或销毁的。另一方面,Windows的窗口是Windows的一种内部数据结构,它是由CWnd的Create成员函数创建的,而由CWnd的虚拟析构函数销毁。DestroyWindow函数销毁Windows的窗口,但是不销毁对象。 CWnd类和消息映射机制隐藏了WndProc函数。接收到的Windows通知消息通过消息映射被自动发送到适当的CWnd OnMessage成员函数。你可以在派生类重载OnMessage成员函数以处理成员的特定消息CWnd类同时还使你能够为应用程序创建Windows的子窗口。先从CWnd继承一个类,然后在派生类加入成员变量以保存与你的应用程序有关的数据。在派生类实现消息处理成员函数和消息映射,以指定当消息被发送到窗口时应该如何动作。 你可以经过两个步骤来创建一个子窗口。首先,调用构造函数CWnd以创建一个CWnd对象,然后调用Create成员函数以创建子窗口并将它连接到CWnd对象。 当用户关闭你的子窗口时,应销毁CWnd对象,或者调用DestroyWindow成员函数以清除窗口并销毁它的数据结构。 在微软基础类库,从CWnd派生了许多其它类以提供特定的窗口类型。这些类有许多,包括CFrameWnd,CMDIFrameWnd,CMDIChildWnd,CView和CDialog,被用来进一步派生。从CWnd派生的控件类,如CButton,可以被直接使用,也可以被进一步派生出其它类来。

3,248

社区成员

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

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