將ActiveX中的資料匯出為js中的對象

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.