vc++訪問javascript(4)–原來函數也是對象

來源:互聯網
上載者:User

我們已經知道如何用VC++訪問並調用javascript中的函數了。那麼如何在VC++中實現一個函數,以便在javascript中進行調用呢?比如,我們用VC++提供一個函數綁定某個網頁元素的onclick事件,當事件到達時,可以調用VC++中的這個函數。

其實,在javascript中,函數(function)也是一個對象。從VC++的角度來看,當我們調用function時,事實上是在調用function對象的0方法(也就是預設方法)。什麼是0方法呢?任何對象都為自己管理的所有成員(包括所有屬性和方法)分配一個唯一的DISPID,當調用對象的某個方法時,先通過方法名稱取得它的DISPID,然後使用DISPID調用對象的Invoke方法(如果提供了IDispatchEx介面,則調用InvokeEx方法)。當某個成員的DISPID等於0時,它就是這個對象的預設屬性或預設方法(我們就叫做0方法吧)。0方法的好處就在於,在實際的調用中,我們可以不必指定0方法的名稱從而完成調用。如果大家使用過VB編程,就知道0屬性或0方法是很普遍的用法了。

於是,我們就可以用VC++實現一個COM對象,繼承自IDispatch介面,並提供一個0方法,然後用這個COM對象綁定網頁元素的onclick事件就可以了。另外,要想使這個COM對象支援帶this指標的調用,就必須繼承自IDispatchEx介面。在實戰中,綁定網頁元素的事件只需繼承自IDispatch介面就可以了。

 

下面,我們就實現一個帶0方法的COM對象

  1. // IVCFunction
  2. [
  3.  object,
  4.  uuid("E0B4E698-945D-4CD5-BF8B-ECE65DA39DFE"),
  5.  dual, helpstring("IVCFunction Interface"),
  6.  pointer_default(unique)
  7. ]
  8. __interface IVCFunction : IDispatch
  9. {
  10. };
  11. // CVCFunction
  12. [
  13.  coclass,
  14.  default(IVCFunction),
  15.  threading(apartment),
  16.  vi_progid("PIMShellDemo.VCFunction"),
  17.  progid("PIMShellDemo.VCFunction.1"),
  18.  version(1.0),
  19.  uuid("F4BA402B-3A59-49CC-85A1-12E91E5A0F99"),
  20.  helpstring("VCFunction Class")
  21. ]
  22. class ATL_NO_VTABLE CVCFunction :
  23.  public IDispatchImpl<IVCFunction>
  24. {
  25. public:
  26.  CVCFunction()
  27.  {
  28.  }
  29.  DECLARE_PROTECT_FINAL_CONSTRUCT()
  30.  HRESULT FinalConstruct()
  31.  {
  32.   return S_OK;
  33.  }
  34.  void FinalRelease()
  35.  {
  36.  }
  37. public:
  38.  STDMETHOD(Invoke)(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags,
  39.         DISPPARAMS* pDispParams, VARIANT* pvarResult,
  40.         EXCEPINFO*  pExcepInfo,  UINT* puArgErr)
  41.  {
  42.   //只支援0方法
  43.   if(dispidMember!=0)
  44.    return E_INVALIDARG;
  45.   //如果是通過attachEvent綁定網頁元素的事件,那麼傳入的第一個參數就是event對象
  46.   MSHTML::IHTMLEventobjPtr pEvent=pDispParams->rgvarg[0].pdispVal;
  47.   //event.type
  48.   _bstr_t bstrType=pEvent->type;
  49.   //
  50.   if(::wcscmp(bstrType,L"click")==0)
  51.   {
  52.    //這裡執行響應onclick事件的代碼
  53.   }
  54.  
  55.   return S_OK;
  56.  }
  57. };
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.