您的位置:首页 > Web前端 > JavaScript

开发IE下js使用的com组件,包含事件处理

2015-01-06 23:07 405 查看
很简单,将事件做成属性,并设置属性的bindable, displaybind标记。

在js下面直接将function传给这个属性,com组件里面调用这个IDispatch的函数即可。

idl文件,注意onevent1这里。

import "oaidl.idl";
import "ocidl.idl";

[
object,
uuid(6A6140E8-9356-4FBD-B0FD-04508D336B17),
dual,
nonextensible,
pointer_default(unique)
]
interface IComClassTest : IDispatch{
[id(1)] HRESULT Method1(BSTR arg1);
[propget, id(2), bindable, displaybind] HRESULT onevent1([out, retval] VARIANT* pVal);
[propput, id(2), bindable, displaybind] HRESULT onevent1([in] VARIANT newVal);
};
[
uuid(97157E1C-637C-4962-B069-96E70F572A99),
version(1.0),
]
library ATLProject3Lib
{
importlib("stdole2.tlb");
[
uuid(14D66A8E-899E-4A72-A2FD-3F9720BD1DF7)
]
dispinterface _IComClassTestEvents
{
properties:
methods:
};
[
uuid(887AF328-699E-4750-8FE7-F3D715CA7983)
]
coclass ComClassTest
{
[default] interface IComClassTest;
[default, source] dispinterface _IComClassTestEvents;
};
};


部分实现代码
STDMETHODIMP CComClassTest::Method1(BSTR arg1)
{
// TODO:  在此添加实现代码
if (m_onevent1) {
DISPPARAMS params = { nullptr, nullptr, 0, 0 };
m_onevent1.Invoke0((DISPID)0);
}
return S_OK;
}

STDMETHODIMP CComClassTest::get_onevent1(VARIANT* pVal)
{
// TODO:  在此添加实现代码
pVal->vt = VT_DISPATCH;
V_DISPATCH(pVal) = m_onevent1;
return S_OK;
}

STDMETHODIMP CComClassTest::put_onevent1(VARIANT newVal)
{
// TODO:  在此添加实现代码
m_onevent1 = V_DISPATCH(&newVal);
return S_OK;
}
m_onevent是CComDispatchDriver对象。

测试例子

<html>
<body>
<script type="text/javascript">
var t = new ActiveXObject("ATLProject3.ComClassTest");
t.onevent1 = function() {
console.log("sdfsdfsdf");
}
t.Method1("123");
</script>
</body>
</html>


在IE中刷新这个页面,在控制台里面能看到效果。

不过,现在会提示ActiveX安全性问题。在ATL技术内幕这本书里面有讲到怎么不让它提示,现在找不到在哪里了,等以后看到了再补上吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐