ATL ActiveX的工作线程如何向主线程发送消息,再由主线程Fire_XXX给javascript

A_cool 2012-05-23 08:30:54
ATL 工作线程如何向主线程发送消息,再由主线程Fire_XXX给javascript。

试了工作线程使用SendMessage(handle, WM_STATE_CHANGE, (WPARAM)strlen(json), (LPARAM)json)发送消息

主线程收到消息,进行Fire但是javascript收不到。
class ATL_NO_VTABLE CTelImpl

实现:
LRESULT CTelImpl::OnCallStateChange(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)
{
CComBSTR bstrText("事件通知消息传递测试!");
Fire_CallStateChange(&bstrText);
return S_OK;
}

我使用的是VC2010,有没有相关的实例提供一个,感激万分!
...全文
282 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
cctvlhwx12 2013-11-07
  • 打赏
  • 举报
回复
楼主,你好,我也是同样的方式,但是控件无法响应自定义的消息,你能不能把你建立自定义消息的代码发出来参考下感谢
惜玉 2012-06-07
  • 打赏
  • 举报
回复
近段时间我也在弄这个东西,你的问题原因在于连接点的接口只能由创建它的线程调用,其它线程调用invoke会失败。SendMessage是同步的,而PostMessage是异步的。
A_cool 2012-05-24
  • 打赏
  • 举报
回复
终于搞定了,失败原因如下:
试了工作线程使用SendMessage发送的消息,用此消息无法触发的js的回调。
修改为PostMessage发送消息给主窗体所有问题迎刃而解。

【猜测】
SendMessage由于是阻塞发送方式,使用的依旧是工作线程,或者阻塞对回调JS有影响。
A_cool 2012-05-24
  • 打赏
  • 举报
回复
目前遇到的问题总结一下应该是:
1、JS主动调用ActiveX提供的函数,在在此函数中Fire_XXXX, JS成功接收到事件。
2、实现ATL Ctrl的WM_LBUTTONDOWN的事件监听函数,在此函数中Fire_XXXX,鼠标点击后JS成功接收到事件。
=========================================================================
JS无法收到事件的情况
1、工作线程发送自定义消息给主线程,主线程Fire_XXXX, JS无法接收事件
2、工作线程发送WM_LBUTTONDOWN消息给主线程,事件监听函数Fire_XXXX, JS无法收到事件。

【猜测】
难道,只有JS请求后,Fire才能成功,ActiveX主动Fire无法成功?

如果真是那样的话,我的实现思路就要改了。


96掌门师兄 2012-05-24
  • 打赏
  • 举报
回复
对,javascript是弱语言,无法知道你的事件,只有回调告诉js, 发给主线程可以记下主线程的句柄(是个框架类吧),然后主线程回调。
A_cool 2012-05-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

还有就是看看Fire_CallStateChange的实现形式
[/Quote]

下面是VC2010自动生成的Fire_CallStateChange,我是真的不擅长这块儿,很着急啊。

HRESULT Fire_CallStateChange(BSTR* result)
{
HRESULT hr = S_OK;
T * pThis = static_cast<T *>(this);
int cConnections = m_vec.GetSize();

for (int iConnection = 0; iConnection < cConnections; iConnection++)
{
pThis->Lock();
CComPtr<IUnknown> punkConnection = m_vec.GetAt(iConnection);
pThis->Unlock();

IDispatch * pConnection = static_cast<IDispatch *>(punkConnection.p);

if (pConnection)
{
CComVariant avarParams[1];
avarParams[0].byref = result;
avarParams[0].vt = VT_BSTR|VT_BYREF;
CComVariant varResult;

DISPPARAMS params = { avarParams, NULL, 1, 0 };
hr = pConnection->Invoke(1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, ¶ms, &varResult, NULL, NULL);
}
}
return hr;
}
fishion 2012-05-24
  • 打赏
  • 举报
回复
还有就是看看Fire_CallStateChange的实现形式
A_cool 2012-05-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

事件,连接点的问题吧,你了解下这两方面的
[/Quote]

感谢fishion的回复,我先学习一下这两个知识点,如有新的进展也将公布出来。
fishion 2012-05-24
  • 打赏
  • 举报
回复
事件,连接点的问题吧,你了解下这两方面的
A_cool 2012-05-24
  • 打赏
  • 举报
回复
我主要想知道,ATL ActiveX使用 Fire_XXXX的实现方法,JS调用ActiveX直接Fire_XXXX,JS能收到事件,但是通过工作线程自定义消息SendMessage到主线程后,主线程Fire_XXXX,JS就没有任何反应。

补充一下:我使用IE9运行HTML,使用js与ActiveX互通。
fishion 2012-05-23
  • 打赏
  • 举报
回复
http://hi.baidu.com/atyuwen/blog/item/318ceb9b220c1db0c9eaf491.html
或者是这个
fishion 2012-05-23
  • 打赏
  • 举报
回复
http://blog.csdn.net/andrew_85/article/details/5266180
不知道你是不是想这样的

如果不是的话得到IWebBrowser2指针,用document方法再得到IHtmlDocument2接口,用这接口的parentWindow方法得到IHTMLWindow2,再调用execScript执行javascript
  • 打赏
  • 举报
回复
javascript是一种脚本,如果没有宿主的话是收不到信息的....你的宿主是什么??浏览器么??

3,245

社区成员

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

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