假设要开发一个ActiveX控件,其中有一个方法GetMyData(),它返回一个对象;该对象拥有两个属性,id和name。
现在,我们想要在js中使用这个对象;
var ax = new ActiveXObject("...");
var mydata = ax.GetMyData();
mydata.id ...
mydata.name ...
通过一般的继承自IDispatch或IDisptachImpl<...>的方法,我们可以实现对属性或方法的访问:
class ATL_NO_VTABLE CMyData :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CMyData, &CLSID_MyData>,
public IDispatchImpl<IMyData, &IID_IMyData, &LIBID_MYLib>
但是,用这种方法,无法支持for(var i in mydata)这种js循环。
想要达到目的,就需要使用js中的数据类型:IDispatchEX。
首先,在IDL中添加:
import "dispex.idl";
并修改IMyData:IDispatch为:
IMyData: IDispatchEx
其次,在CMyData的头文件MyData.h中添加:
#include <dispex.h>
并修改
BEGIN_COM_MAP(CMyData)
COM_INTERFACE_ENTRY(IMyData)
COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()
为:
BEGIN_COM_MAP(CMyData)
COM_INTERFACE_ENTRY(IMyData)
COM_INTERFACE_ENTRY(IDispatchEx)
COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()
最后,实现IDispatchEX接口:
virtual HRESULT STDMETHODCALLTYPE GetDispID(
/* [in] */ BSTR bstrName,
/* [in] */ DWORD grfdex,
/* [out] */ DISPID __RPC_FAR *pid)
{
...
}
virtual /* [local] */ HRESULT STDMETHODCALLTYPE InvokeEx(
/* [in] */ DISPID id,
/* [in] */ LCID lcid,
/* [in] */ WORD wFlags,
/* [in] */ DISPPARAMS __RPC_FAR *pdp,
/* [out] */ VARIANT __RPC_FAR *pvarRes,
/* [out] */ EXCEPINFO __RPC_FAR *pei,
/* [unique][in] */ IServiceProvider __RPC_FAR *pspCaller)
{
...
}
virtual HRESULT STDMETHODCALLTYPE DeleteMemberByName(
/* [in] */ BSTR bstr,
/* [in] */ DWORD grfdex)
{
...
}
virtual HRESULT STDMETHODCALLTYPE DeleteMemberByDispID(
/* [in] */ DISPID id)
{
...
}
virtual HRESULT STDMETHODCALLTYPE GetMemberProperties(
/* [in] */ DISPID id,
/* [in] */ DWORD grfdexFetch,
/* [out] */ DWORD __RPC_FAR *pgrfdex)
{
...
}
virtual HRESULT STDMETHODCALLTYPE GetMemberName(
/* [in] */ DISPID id,
/* [out] */ BSTR __RPC_FAR *pbstrName)
{
...
}
virtual HRESULT STDMETHODCALLTYPE GetNextDispID(
/* [in] */ DWORD grfdex,
/* [in] */ DISPID id,
/* [out] */ DISPID __RPC_FAR *pid)
{
...
}
virtual HRESULT STDMETHODCALLTYPE GetNameSpaceParent(
/* [out] */ IUnknown __RPC_FAR *__RPC_FAR *ppunk)
{
...
}
另外一种方法是直接使用js接口,具体方法可参考:
VC中如何创建JavaScript的Array对象:http://4develop.in/csdn/VC/20091229_14_147ed93c-9fd8-4fa5-83ea-9c93083ee9c9/1