zoukankan      html  css  js  c++  java
  • WebBrowser之JS调用C++函数

    附上上篇文章----C++调用JS:http://www.cnblogs.com/aishangxue/p/3397781.html

    JS可以调用C++编写的函数,需要以下步骤:

    1)定义一个组件类,需要实现IDispatch接口。

    2)在GetExternal 函数中返回上面定义组件。

    3)在定义的组件类中实现GetIDsOfNames,

    GetIDsOfNames( __RPC__in REFIID riid, __RPC__in_ecount_full(cNames ) LPOLESTR *rgszNames, UINT cNames, LCID lcid, __RPC__out_ecount_full(cNames) DISPID *rgDispId )

    其中rgszNames是JS中调用的名称,我们需要用rgDispId返回需要被调用方法的ID。

    返回S_OK代表成功找到。

    4)实现Invoke方法,

    Invoke( DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr )

    其中dispIdMember是调用方法的ID(与上步中利用rgDispId传回的ID值对应),如果传入的是JS调用的方法ID,则调用相应的C++函数即可。

    例如我需要在JS中调用这个方法

    window.external.MyMethod();

    下面具体贴出来DUILIB 中 的WebBrowser实现:

    1 STDMETHODIMP CWebBrowserExUI::GetExternal( IDispatch** ppDispatch )
    2 {
    3     *ppDispatch = this;
    4     return S_OK;
    5 }
    1 HRESULT STDMETHODCALLTYPE CWebBrowserExUI::GetIDsOfNames( __RPC__in REFIID riid, __RPC__in_ecount_full(cNames ) LPOLESTR *rgszNames, UINT cNames, LCID lcid, __RPC__out_ecount_full(cNames) DISPID *rgDispId )
    2 {
    3     //DISP ID 从200开始
    4     if(_tcscmp(rgszNames[0],_T("MyMethod")) == 0){
    5         *rgDispId = 200;
    6         return S_OK;
    7     }
    8     return __super::GetIDsOfNames(riid,rgszNames,cNames,lcid,rgDispId);
    9 }
     1 STDMETHODIMP CWebBrowserExUI::Invoke( DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr )
     2 {
     3     if ((riid != IID_NULL))
     4         return E_INVALIDARG;
     5 
     6     switch(dispIdMember)
     7     {
     8     case 200:
     9         MyMethod();
    10         break;
    11     }
    12 
    13     return __super::Invoke(dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
    14 }
    15 
    16 void CWebBrowserExUI::MyMethod(){
    17 
    18 }

    参考:http://www.cnblogs.com/lucc/archive/2010/11/24/1886087.html

  • 相关阅读:
    jquery Banner 图片自动轮换显示
    JavaScript:appendDiv(append和appendChild的区别)
    JavaScript:addEventListener()和removeEventListener()追加事件和删除追加事件
    Cesium源码之CesiumMath(1.62版)
    cesium功能插件
    JavaScript之prototype
    JavaScript规范define(AMD)
    Cesium之时间
    Cesium CallbackProperty实例
    pku3620 Avoid The Lakes 查找最大连通湖(简单深搜)
  • 原文地址:https://www.cnblogs.com/aishangxue/p/3411070.html
Copyright © 2011-2022 走看看