假設要開發一個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