標籤:
最近關於vc++裡面通過IDispatch的Invoke來實現和js的互動做點了tp,並且對以前不瞭解的“直接讀取js變數值”和“傳遞多個參數”的部分重新實現了下。
1,調用js的函數,並傳遞多個參數
CComQIPtr<IHTMLDocument2> pDoc = m_browser.get_Document();if (pDoc){CComQIPtr<IDispatch> spDisp;HRESULT hr = pDoc->get_Script(&spDisp);if (SUCCEEDED(hr)){ //要調用的函數名TCHAR* szMember = _T("setText");DISPID dispid;HRESULT hr = spDisp->GetIDsOfNames(IID_NULL, &szMember, 1,LOCALE_SYSTEM_DEFAULT, &dispid);if (SUCCEEDED(hr)){DISPPARAMS dispparams;memset(&dispparams, 0, sizeof dispparams);dispparams.cArgs = 2;//要傳遞的參數,注意強烈推薦用下面這個形式。傳送string的時候,改為BSTR就可以。 CComVariant* pvars = new CComVariant[2]; pvars[1] = L"1"; pvars[0] = L"2"; pvars[0].ChangeType(VT_I4);pvars[1].ChangeType(VT_I4);dispparams.rgvarg = pvars;dispparams.cNamedArgs = 0;EXCEPINFO excepInfo;memset(&excepInfo, 0, sizeof(excepInfo));CComVariant vaResult;UINT nArgErr = (UINT)-1; // initialize to invalid arghr = spDisp->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD,&dispparams,&vaResult,&excepInfo,&nArgErr);}}}
2,直接讀取js的變數(不是通過對某個控制項賦值再讀取的形式)
CComQIPtr<IHTMLDocument2> pDoc = m_browser.get_Document();if (pDoc){CComQIPtr<IDispatch> spDisp;HRESULT hr = pDoc->get_Script(&spDisp);if (SUCCEEDED(hr)){ //js中的變數名字TCHAR* szMember = _T("nItem");DISPID dispid;HRESULT hr = spDisp->GetIDsOfNames(IID_NULL, &szMember, 1,LOCALE_SYSTEM_DEFAULT, &dispid);if (SUCCEEDED(hr)){DISPPARAMS dispparams;memset(&dispparams, 0, sizeof dispparams);EXCEPINFO excepInfo;memset(&excepInfo, 0, sizeof(excepInfo));CComVariant vaResult;UINT nArgErr = (UINT)-1; // initialize to invalid arghr = spDisp->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET,&dispparams,&vaResult,&excepInfo,&nArgErr);}}}
參考:
http://blog.csdn.net/hzlyh/article/details/5411086
可惜對js的變數直接賦值的時候,Invoke一直不能成功,還有待於繼續調查。。。。。
VC與JavaScript互動(二)