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

0313700000 2003-12-12 11:31:50
如何在组件中使用自定义消息?
...全文
78 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
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

3,248

社区成员

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

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