ActiveX异步回调JavaScript(通过事件方式)

来源:互联网 发布:2017很火的网络歌曲 编辑:程序博客网 时间:2024/05/16 06:05

版权声明

请尊重原创作品。转载请保持文章完整性,并以超链接形式注明原始作者“tingsking18”和主站点地址,方便其他朋友提问和指正。

 

以前是用的事件机制来调用JavaScript,事件和回调本来就是一回事。但是由于没有解决线程同步问题,所以就一直没有调通。JavaScript中死活也不响应异步发送过来的事件。前天用Idispatch接口调通了JavaScript。但是始终觉得不是那么回事,这样会麻烦死的。

       于是回过头来思考,用事件是不是只要线程同步一下就可以了?今天早上试了一下,果然没有问题。

注意:对于多线程的,一定要线程同步(PostMessage方式传递到*Ctrl类里去执行),否则无法调用js

下面介绍一下具体的步骤:

1.       建立MFC ActiveX Control(方法略)

2.       在ClassWizard automation页添加方法invoke。Invoke函数代码如下:

void CForthCtrl::invoke(short a){m_a = a;_beginthread(f, 0, (void*)(this));}

3.       在上面的invoke方法中调用了线程函数f,在f函数中要调用界面控件CforthCtrl,所以必须进行线程同步,我们使用了PostMessage方法同步 (以前就是忽略了这里,所以才调不通JavaScript的) 。f函数的代码如下:

void f(void * r){CForthCtrl* p = (CForthCtrl*)r;Sleep(5000);p->m_a +=10;PostMessage(p->m_hWnd,WM_THREADFIREEVENT,(WPARAM)NULL,(LPARAM)NULL);return;}

4.       在ClassWizard ActiveX Events页添加事件calljs,事件的参数为short类型的参数,用于将结果传递到JavaScript中去。

或者如下图,在类视图**Ctrl类上右键,添加,添加事件


5.       添加WM_THREADFIREEVENT消息的消息映射函数。代码如下:

LRESULT CForthCtrl::OnFireEventForThread(WPARAM wParam, LPARAM lParam){this->calljs(m_a);return TRUE;}

6.       用ActiveX Control Test Container测试一下。看看调用invoke的时候会不会触发calljs事件。

7.       打开Microsoft ActiveX Control Pad,插入我们刚刚编写的控件。然后添加调用invoke的按钮,并且添加响应calljs函数的代码。

<HTML><HEAD><TITLE>New Page</TITLE></HEAD><BODY>    <SCRIPT LANGUAGE="JavaScript" FOR="Forth1" EVENT="calljs(param)">    alert(param);    </SCRIPT><script LANGUAGE="JavaScript">function test(){Forth1.invoke(1);}</script>    <OBJECT ID="Forth1" WIDTH=100 HEIGHT=51     CLASSID="CLSID:52510A20-E949-4213-89FD-8A2AE5A7F6D4">        <PARAM NAME="_Version" VALUE="65536">        <PARAM NAME="_ExtentX" VALUE="2646">        <PARAM NAME="_ExtentY" VALUE="1323">        <PARAM NAME="_StockProps" VALUE="0">    </OBJECT><input type ="button" value="test" onclick="test();"></BODY></HTML>

总结:

1.    使用事件机制比前面的方法省老鼻子劲了,少写多少代码啊。

2.    使用Idispatch接口还是很容易出错的,并且不容易查找错误。

3.    事件方式不用传函数名进去,直接在JavaScript中挂接事件就可以了。

4.    线程操作界面一定记得要同步啊!!!!!!

0 0
原创粉丝点击