之前写过文章通过自定义函数来实现ActiveX回调JS中的函数,最近在网上发现一更简洁的方法,通过事件触发,在这里小结一下,为使内容连贯,请参考我之前的《一步一步实现ATL开发的ActiveX组件与javascript的交互》系列文章http://hi.baidu.com/hwygy_001/blog/item/21ec5bc5294f64bd8326ac72.html:
1. 如果使用的是VS2010,则在Class View窗口中右击_ICalcEvents接口,依次选择“Add”、“Add Method…”,根据添加方法向导添加AddCompleted方法,如下图所示:
若采用的VS2008,则没有自动的事件方法,需要手工注册,找到项目的.idl文件,在其中的library CalculatorLib中添加如下代码:
dispinterface_ICalcEvents
{
properties:
methods:
[id(1)]voidAddCompleted([in]DOUBLE * bstrCmdInfo);
};
完成手工注册。
2. 然后在Class View窗口中右击CCalc类,依次选择“Add”、“Add Connection Point…”,在弹出的实现连接点窗口中实现_ICalcEvents接口。
3. 完成向导后,VS会自动为我们生成基本框架,包括引发事件的方法Fire_AddCompleted。我们只需在Add方法中添加_ICalcEvents_CP.h(生成的Fire_AddCompleted方法所在文件)头文件,运算并在运算结束时调用Fire_AddCompleted的代码:
STDMETHODIMP CCalc::Add(DOUBLE a, DOUBLE b,DOUBLE * result)
{ double result;
*result = a + b;
Fire_AddCompleted(result);
return S_OK;
}
4.在网页中添加代码进行测试(添加的javascript代码如下),应该能够得到我们想要的效果。
<script type="text/javascript">
function add() {
var calc = document.getElementById('Calc');
calc.attachEvent("AddCompleted", OnAddCompleted);
calc.Add(3, 4);
}
function OnAddCompleted(result) {
alert(result);
}
</script>
参考文章:http://www.cnblogs.com/chinadhf/archive/2010/09/03/1817336.html
from:http://hi.baidu.com/hwygy_001/item/fd04a23a2649be0acfb9fe23