将ActiveX中的数据导出为js中的对象

来源:互联网 发布:上海数据港曾犁简历 编辑:程序博客网 时间:2024/05/22 06:28

假设要开发一个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

原创粉丝点击