duilib:C++调用js函数&&js中调用C++函数

一、js中调用C++函数。函数原型

  1. int g_FunSub(int x,int y);  
int g_FunSub(int x,int y);

调用方式如下:

  1. <html>    
  2. <head>    
  3.     <meta charset=“utf-8” />    
  4.     <title></title>    
  5.     <script language=“javascript”>    
  6.         function CallCppFunSub(x,y)    
  7.         {  
  8.             var num = window.external.g_FunSub(x,y);   
  9.             alert(num);  
  10.             return num  
  11.         }   
  12.         function JsFunSub(x,y)    
  13.         {  
  14.             var num = x - y;  
  15.             alert(num);  
  16.             return num  
  17.         }  
  18.     </script>    
  19. </head>    
  20. <body>  
  21.     <button type=“button” onclick=“CallCppFunSub(4,7)”>调用C++函数</button>    
  22. </body>    
  23. </html>   
<html> 
<head>
<meta charset="utf-8" />
<title></title>
<script language="javascript">
function CallCppFunSub(x,y)
{
var num = window.external.g_FunSub(x,y);
alert(num);
return num
}
function JsFunSub(x,y)
{
var num = x - y;
alert(num);
return num
}
</script>
</head>
<body>
<button type="button" οnclick="CallCppFunSub(4,7)">调用C++函数</button>
</body>
</html>
具体实现是在C++代码中写的:

  1. #pragma once  
  2.   
  3. class CWebBrowserExUI :  
  4.     public CWebBrowserUI  
  5. {  
  6. public:  
  7.     CWebBrowserExUI();  
  8.     ~CWebBrowserExUI();  
  9.   
  10.     LPCTSTR GetClass() const;  
  11.     LPVOID GetInterface(LPCTSTR pstrName);  
  12.   
  13.     virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(__RPC__in REFIID riid, __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames, UINT cNames, LCID lcid, __RPC__out_ecount_full(cNames) DISPID *rgDispId);  
  14.     virtual HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr);  
  15.   
  16.     virtual HRESULT STDMETHODCALLTYPE GetExternal(IDispatch **ppDispatch)  
  17.     {  
  18.         //重写GetExternal返回一个ClientCall对象  
  19.         *ppDispatch = this;  
  20.         return S_OK;  
  21.     }  
  22. };  
#pragma once

class CWebBrowserExUI :
public CWebBrowserUI
{
public:
CWebBrowserExUI();
~CWebBrowserExUI();

LPCTSTR GetClass() const;
LPVOID GetInterface(LPCTSTR pstrName);

virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(__RPC__in REFIID riid, __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames, UINT cNames, LCID lcid, __RPC__out_ecount_full(cNames) DISPID *rgDispId);
virtual HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr);

virtual HRESULT STDMETHODCALLTYPE GetExternal(IDispatch **ppDispatch)
{
    //重写GetExternal返回一个ClientCall对象
    *ppDispatch = this;
    return S_OK;
}
};

  1. #include “stdafx.h”  
  2. #include “WebBrowserExUI.h”  
  3. #include <atlcomcli.h>  
  4.   
  5.   
  6. int g_FunSub(int x, int y)  
  7. {  
  8.     return (x - y);  
  9. }  
  10.   
  11. CWebBrowserExUI::CWebBrowserExUI()  
  12. {  
  13. }  
  14.   
  15.   
  16. CWebBrowserExUI::~CWebBrowserExUI()  
  17. {  
  18. }  
  19.   
  20.   
  21. LPCTSTR CWebBrowserExUI::GetClass() const  
  22. {  
  23.     return _T(“WebBrowserExUI”);  
  24. }  
  25.   
  26. LPVOID CWebBrowserExUI::GetInterface(LPCTSTR pstrName)  
  27. {  
  28.     if (_tcsicmp(pstrName, _T(“WebBrowserEx”)) == 0)  
  29.         return static_cast<CWebBrowserExUI*>(this);  
  30.   
  31.     return CActiveXUI::GetInterface(pstrName);  
  32. }  
  33.   
  34.   
  35. HRESULT CWebBrowserExUI::GetIDsOfNames(const IID& riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgDispId)  
  36. {  
  37.     //DISP ID 从200开始  
  38.     if (_tcscmp(rgszNames[0], _T(“g_FunSub”)) == 0)  
  39.         rgDispId = 500;  
  40.   
  41.     return S_OK;  
  42. }  
  43.   
  44. HRESULT CWebBrowserExUI::Invoke(DISPID dispIdMember, const IID& riid, LCID lcid, WORD wFlags, DISPPARAMS pDispParams, VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)  
  45. {  
  46.     //MyOutputDebugStringW(L”%d\n”, dispIdMember);  
  47.     switch (dispIdMember)  
  48.     {  
  49.     case 500:  
  50.     {  
  51.         // 注意参数顺序,反向  
  52.         VARIANTARG *varArg = pDispParams->rgvarg;  
  53.         int x = _ttoi(static_cast<_bstr_t>(varArg[1]));  
  54.         int y = _ttoi(static_cast<_bstr_t>(varArg[0]));  
  55.         int n = g_FunSub(x, y);  
  56.         *pVarResult = CComVariant(n);  
  57.         return S_OK;  
  58.     }  
  59.   
  60.     default:  
  61.         break;  
  62.     }  
  63.   
  64.     return CWebBrowserUI::Invoke(dispIdMember, riid, lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);  
  65. }  
#include “stdafx.h”

#include "WebBrowserExUI.h"

include <atlcomcli.h>

int g_FunSub(int x, int y)
{
return (x - y);
}

CWebBrowserExUI::CWebBrowserExUI()
{
}

CWebBrowserExUI::~CWebBrowserExUI()
{
}

LPCTSTR CWebBrowserExUI::GetClass() const
{
return _T(“WebBrowserExUI”);
}

LPVOID CWebBrowserExUI::GetInterface(LPCTSTR pstrName)
{
if (_tcsicmp(pstrName, _T(“WebBrowserEx”)) == 0)
return static_cast<CWebBrowserExUI*>(this);

return CActiveXUI::GetInterface(pstrName);
} HRESULT CWebBrowserExUI::GetIDsOfNames(const IID& riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgDispId) { //DISP ID 从200开始 if (_tcscmp(rgszNames[0], _T(“g_FunSub”)) == 0) *rgDispId = 500;
return S_OK;
} HRESULT CWebBrowserExUI::Invoke(DISPID dispIdMember, const IID& riid, LCID lcid, WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr) { //MyOutputDebugStringW(L”%d\n”, dispIdMember); switch (dispIdMember) { case 500: { // 注意参数顺序,反向 VARIANTARG *varArg = pDispParams->rgvarg; int x = _ttoi(static_cast<_bstr_t>(varArg[1])); int y = _ttoi(static_cast<_bstr_t>(varArg[0])); int n = g_FunSub(x, y); *pVarResult = CComVariant(n); return S_OK; }
default:
    break;
}

return CWebBrowserUI::Invoke(dispIdMember, riid, lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
}



二、C++调用js方法。

  1. function JsFunSub(x,y)  
function JsFunSub(x,y)
C++中这么调用:

  1. void CMainFrameWnd::OnClick(TNotifyUI& msg)  
  2. {  
  3.     CDuiString sCtrlName = msg.pSender->GetName();  
  4.   
  5.     if (sCtrlName.CompareNoCase(_T(“CallJsBtn”)) == 0)  
  6.     {  
  7.         // C++调用js方法,示例  
  8.         // 注意参数顺序,反向  
  9.         VARIANT arg[2] = { CComVariant(7),CComVariant(3)};//JsFunSub(3,7)  
  10.         VARIANT varRet;  
  11.         m_pBrowser->InvokeMethod(m_pBrowser->GetHtmlWindow(),_T(”JsFunSub”),&varRet,arg,2);  
  12.         int nResult =  varRet.intVal;//-4  
  13.         return;  
  14.     }  
  15.   
  16.   
  17.     WindowImplBase::OnClick(msg);  
  18. }  
void CMainFrameWnd::OnClick(TNotifyUI& msg)
{
    CDuiString sCtrlName = msg.pSender->GetName();

    if (sCtrlName.CompareNoCase(_T("CallJsBtn")) == 0)
    {
        // C++调用js方法,示例
        // 注意参数顺序,反向
        VARIANT arg[2] = { CComVariant(7),CComVariant(3)};//JsFunSub(3,7)
        VARIANT varRet;
        m_pBrowser->InvokeMethod(m_pBrowser->GetHtmlWindow(),_T("JsFunSub"),&varRet,arg,2);
        int nResult =  varRet.intVal;//-4
        return;
    }


    WindowImplBase::OnClick(msg);
}

js中这样实现:

  1. <html>    
  2. <head>    
  3.     <meta charset=“utf-8” />    
  4.     <title></title>    
  5.     <script language=“javascript”>    
  6.         function CallCppFunSub(x,y)    
  7.         {  
  8.             var num = window.external.g_FunSub(x,y);   
  9.             alert(num);  
  10.             return num  
  11.         }   
  12.         function JsFunSub(x,y)    
  13.         {  
  14.             var num = x - y;  
  15.             alert(num);  
  16.             return num  
  17.         }  
  18.     </script>    
  19. </head>    
  20. <body>  
  21.     <button type=“button” onclick=“CallCppFunSub(4,7)”>调用C++函数</button>    
  22. </body>    
  23. </html>   
<html>  
<head>  
    <meta charset="utf-8" />  
    <title></title>  
    <script language="javascript">  
        function CallCppFunSub(x,y)  
        {
            var num = window.external.g_FunSub(x,y); 
            alert(num);
            return num
        } 
        function JsFunSub(x,y)  
        {
            var num = x - y;
            alert(num);
            return num
        }
    </script>  
</head>  
<body>
    <button type="button" οnclick="CallCppFunSub(4,7)">调用C++函数</button>  
</body>  
</html> 

C++调用javascript请移步这里: http://blog.csdn.net/sunflover454/article/details/60570940


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值