C++通过Webbrowser调用JavaScript

 

// 定义 CWebBrowser2

Code
class CXXXDlg
{
  
  CWebBrowser2        m_theWebBrowser;
  
};

 // 装载包含JavaScript的Html

Code
BOOL CXXXDlg::OnInitDialog()
{
  
  m_theWebBrowser.Navigate2(varURL, varEmpty,varEmpty,varEmpty,varEmpty);
  
}

 // 调用JavaScript

Code
void CXXXDlg::OnBtnClickedButton1()
{
  CString strJsName 
= _T("testArg1");
  CString strJsParam 
= _T("This is a test for call JavaScript from C++")
  CallJScript(strJsName , strJsParam );
}

 // C++调用JavaScript

Code
bool CXXXDlg::GetJScript(CComPtr<IDispatch>& spDisp)
{
    CComPtr
<IHTMLDocument2> pHtmlDoc=NULL;
    CComPtr
<IDispatch> spDocDisp;
    HRESULT hr;
    
if(spDisp == NULL)
    {
        spDocDisp 
= m_theWebBrowser.GetDocument();

        
if(spDocDisp)
        {
            hr 
= spDocDisp->QueryInterface(IID_IHTMLDocument2, (void**)&pHtmlDoc);
            
if (SUCCEEDED(hr) && pHtmlDoc)
            {
                
// get script
                hr = pHtmlDoc->get_Script(&spDisp);
                ATLASSERT(SUCCEEDED(hr));

            }
        }
    }
    ATLASSERT(SUCCEEDED(hr));
    
return SUCCEEDED(hr);
}
// bool CallJScript(const CString strFunc,CComVariant* pVarResult = NULL);
bool CXXXDlg::CallJScript(const CString strFunc,CComVariant* pVarResult)
{
    CStringArray paramArray;
    
return CallJScript(strFunc, paramArray, pVarResult);
}
// bool CallJScript(const CString strFunc,const CString strArg1,CComVariant* pVarResult = NULL);
bool CXXXDlg::CallJScript(const CString strFunc,const CString strArg1,CComVariant* pVarResult)
{
    CStringArray paramArray;
    paramArray.Add(strArg1);
    
return CallJScript(strFunc,paramArray,pVarResult);
}

const CString GetSystemErrorMessage(DWORD dwError)
{
    CString strError;
    LPTSTR lpBuffer;

    
if(!FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
        NULL,  dwError,
        MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT),
        (LPTSTR) 
&lpBuffer, 0, NULL))

    {
        strError 
= _T("FormatMessage Netive Error") ;
    }
    
else
    {
        strError 
= lpBuffer;
        LocalFree(lpBuffer);
    }
    
return strError;
}
// bool CallJScript(const CString strFunc,const CStringArray& paramArray,CComVariant* pVarResult = NULL);
bool CXXXDlg::CallJScript(const CString strFunc, const CStringArray& paramArray,CComVariant* pVarResult)
{
    CComPtr
<IDispatch> spScript=NULL;
    
if(!GetJScript(spScript))
    {
        AfxMessageBox (_T(
"Cannot GetScript"));
        
return false;
    }
    CComBSTR bstrMember(strFunc);
    DISPID dispid 
= NULL;
    HRESULT hr 
= spScript->GetIDsOfNames(IID_NULL,&bstrMember,1,
        LOCALE_SYSTEM_DEFAULT,
&dispid);
    
if(FAILED(hr))
    {
        AfxMessageBox(GetSystemErrorMessage(hr));
        
return false;
    }

    
const int arraySize = paramArray.GetSize();

    DISPPARAMS dispparams;
    memset(
&dispparams, 0sizeof dispparams);
    dispparams.cArgs 
= arraySize;
    dispparams.rgvarg 
= new VARIANT[dispparams.cArgs];

    
forint i = 0; i < arraySize; i++)
    {
        CComBSTR bstr 
= paramArray.GetAt(arraySize - 1 - i); // back reading
        bstr.CopyTo(&dispparams.rgvarg[i].bstrVal);
        dispparams.rgvarg[i].vt 
= VT_BSTR;
    }
    dispparams.cNamedArgs 
= 0;

    EXCEPINFO excepInfo;
    memset(
&excepInfo, 0sizeof excepInfo);
    CComVariant vaResult;
    UINT nArgErr 
= (UINT)-1;  // initialize to invalid arg

    hr 
= spScript->Invoke(dispid,IID_NULL,0,
        DISPATCH_METHOD,
&dispparams,&vaResult,&excepInfo,&nArgErr);

    delete [] dispparams.rgvarg;
    
if(FAILED(hr))
    {
        AfxMessageBox(GetSystemErrorMessage(hr));
        
return false;
    }

    
if(pVarResult)
    {
        
*pVarResult = vaResult;
    }
    
return true;
}

 

 

// 简洁改进

HRESULT CXXUtil::CallJsFunc(const CComPtr<IHTMLDocument2> spDocument2, 
                                    const CString &strJsFuncName, const std::list<CString> &params, CComVariant *pVarResult)
{
    HRESULT hr = S_FALSE;

    if (spDocument2)
    {
        CComPtr<IDispatch> spScript = NULL;
        hr = spDocument2->get_Script(&spScript);

        if (SUCCEEDED(hr) && spScript)
        {
            CComBSTR bstrFunc(strJsFuncName);
            DISPID dispid = 0;
            hr = spScript->GetIDsOfNames(IID_NULL, &bstrFunc, 1, LOCALE_SYSTEM_DEFAULT, &dispid);

            if(SUCCEEDED(hr))
            {
                const size_t paramCnt = params.size();
                DISPPARAMS dispparams = {0};
                //memset(&dispparams, 0, sizeof dispparams);
                dispparams.cArgs = paramCnt;
                dispparams.cNamedArgs = 0;
                dispparams.rgvarg = new VARIANT[dispparams.cArgs];

                for(size_t i = 0; i < paramCnt; i++)
                {
                    std::list<CString>::const_iterator cit = params.begin();
                    std::advance(cit, (paramCnt - 1 - i));// back reading
                    CComBSTR bstrParam = (*cit).GetString();
                    dispparams.rgvarg[i].vt = VT_BSTR;
                    dispparams.rgvarg[i].bstrVal = bstrParam.Detach();
                }

                EXCEPINFO excepInfo = {0};
                //memset(&excepInfo, 0, sizeof excepInfo);
                CComVariant vaResult;
                UINT nArgErr = (UINT)0; //-1;  // initialize to invalid arg

                hr = spScript->Invoke(dispid, IID_NULL, 0 , DISPATCH_METHOD, &dispparams, &vaResult, &excepInfo, &nArgErr);

                // cleanup
                for(UINT ix = 0; ix < dispparams.cArgs; ++ix)
                {
                    ::SysFreeString(dispparams.rgvarg[ix].bstrVal);
                }
                delete [] dispparams.rgvarg;

                if(SUCCEEDED(hr) && pVarResult)
                {
                    *pVarResult = vaResult;
                }
            }
        }
    }

    return hr;
}

 

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/dlbrant/archive/2009/02/16/1391467.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值