如何在组件中使用自定义消息?

0313700000 2003-12-12 11:31:50
如何在组件中使用自定义消息?
...全文
45 10 打赏 收藏 举报
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
0313700000 2003-12-12
我的问题描述如下
我在我的atl复合控件中添加了一个处理socket接受数据的线程,当解析了消息之后,我要去刷新ie上相应的编辑框,但我发现在线程中使用这样的代码
CComPtr<IOleContainer> spIE;
m_spClientSite->GetContainer(&spIE);
CComQIPtr<IHTMLDocument2,&IID_IHTMLDocument2> spDoc(spIE);
CComPtr<IHTMLElement> sp;
HRESULT hr;
if(!spDoc)
{
return S_FALSE;
}
取得spDoc始终失败,在线程外没有问题,就想到了自定义消息,如下添加
#define WM_MSG WM_USER+100

BEGIN_MSG_MAP(CSocketCtrl)

MESSAGE_HANDLER(WM_MSG, OnMyMessage)

END_MSG_MAP()

LRESULT OnMyMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
MessageBox("123","",1);
return 0;
}
这样编译通过,可是我不知道如何在线程中发送消息。使用sendmessage报错

另外:是不是再线程中无法得到IHTMLDocument2指针,如果可以,要如何写,很急,谢谢
  • 打赏
  • 举报
回复
0313700000 2003-12-12
??/???/???
  • 打赏
  • 举报
回复
0313700000 2003-12-12
使用sendmessage不可以,后来我试了postmessage就没了问题还是感谢您的帮助,谢谢
  • 打赏
  • 举报
回复
0313700000 2003-12-12
CComPtr<IOleContainer> spIE;我定义为了组件类的一个变量,
在初始化代码中
HRESULT hr=m_spClientSite->GetContainer(&spIE);
if(FAILED(hr))
{
::MessageBox(NULL,"spIE faild","",1);
}
else
::MessageBox(NULL,"spIE succ","",1);
}
然后定义赋值函数
CComQIPtr<IHTMLDocument2,&IID_IHTMLDocument2> spDoc(spIE);
if(spDoc)
{
::MessageBox(NULL,"spDoc succ","",1);
CComPtr<IHTMLElement> sp;
HRESULT hr=GetHTMLElement(OLESTR("Log1"),&sp);
if(SUCCEEDED(hr))
{
::MessageBox(NULL,"get log1 element succ","",1);


}
else
{
::MessageBox(NULL,"get log1 element faild","",1);
return ;

}
CComVariant a("111");
hr=sp->put_innerText(a.bstrVal);
if(SUCCEEDED(hr))
{
::MessageBox(NULL,"put_innerText succ","",1);

}
else
{
::MessageBox(NULL,"put_innerText faild","",1);
}
reutrn;

}

else
{::MessageBox(NULL,"spDoc faild","",1);}
然后在线程中调用该函数,直到hr=sp->put_innerText(a.bstrVal);所有的操作都成功,但是到了这里就失败了,真是想不到方法了
  • 打赏
  • 举报
回复
0313700000 2003-12-12
但是问题就在于,我使用了SendMessage发送消息,可是主线程的消息接受函数并没有被触发
SendMessage需要一个窗口句柄,可是我怎么得到呢?如果可以,我到愿意把我的代码发给您让您给看下
  • 打赏
  • 举报
回复
蒋晟 2003-12-12
你需要用CoInitializeEx初始化COM才可以跨线程使用COM对象。另外,在线程中可以用SendMessage发送消息到主线程执行代码。
  • 打赏
  • 举报
回复
0313700000 2003-12-12
m_spClientSite->GetContainer(&spIE);我实在线程中取得IE指针出错的
  • 打赏
  • 举报
回复
0313700000 2003-12-12
to Developerljm(飞车) (
您说的参数太多是什么含义?
  • 打赏
  • 举报
回复
0313700000 2003-12-12
::SendMessage(pCtrl->m_hWnd,WM_MSG,0,0);
我再线程中使用上面代码。执行时候没有问题,可并没有触发我的消息,
  • 打赏
  • 举报
回复
Developerljm 2003-12-12
参数太多了,BOOL& bHandled
  • 打赏
  • 举报
回复
发帖
ATL
加入

3231

社区成员

ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
申请成为版主
帖子事件
创建了帖子
2003-12-12 11:31
社区公告
暂无公告