CDHtmlDialog调用网页内部Javascript的两种方法
本文演示了使用COM组件调用网页javascript的两种方法,第一种方法无法获取javascript的返回值,方法比较简单;第二种方法需要MSHTML库的支持,可以获取Javascript的返回值。
假设javascript代码如下:
function add(str) { var o; o = $("test"); o.innerHTML += "<span>" + str + "</span>" return "helloworld!"; }
第一种方法的原理是采用IHTMLWindow2接口的execScript来调用,获取IHTMLWindow2接口可以使用IHTMLDocument2接口的get_parentWindow方法,获取IHTMLDocument2接口可以使用CDHtmlDialog的GetDHtmlDocument方法。具体代码如下:
1 IHTMLDocument2* pDocument; 2 IHTMLWindow2* pWindow; 3 4 HRESULT hr = GetDHtmlDocument(&pDocument); 5 6 ASSERT(SUCCEEDED(hr)); 7 8 hr = pDocument->get_parentWindow(&pWindow); 9 CComBSTR bstrScriptName = TEXT("add('test');"); 10 11 CComVariant ret; // 这个ret变量其实不能获取javascript的返回值 12 13 ret.ChangeType(VT_EMPTY); 14 hr = pWindow->execScript(bstrScriptName, L"Javascript", &ret); 15 16 if (FAILED(hr)) 17 { 18 CComBSTR bstrErrorInfo; 19 IErrorInfoPtr errPtr; 20 21 GetErrorInfo(0, &errPtr); 22 errPtr->GetDescription(&bstrErrorInfo); 23 24 AfxMessageBox(bstrErrorInfo); 25 }
第二种方法采用InvokeHelper方法来调用,代码如下:
1 IHTMLDocument2 *pDocument; 2 HRESULT hr = GetDHtmlDocument(&pDocument); 3 4 MSHTML::IHTMLDocument2Ptr spDoc(pDocument); 5 IDispatchPtr spDisp(spDoc->GetScript()); 6 7 if (spDisp) 8 { 9 OLECHAR FAR *szMember = L"add"; 10 DISPID dispid; 11 CComVariant varRet; 12 static BYTE params[] = VTS_BSTR; 13 14 hr = spDisp->GetIDsOfNames(IID_NULL, &szMember, 1, LOCALE_SYSTEM_DEFAULT, &dispid); 15 COleDispatchDriver dispDriver(spDisp, FALSE); 16 dispDriver.InvokeHelper(dispid, DISPATCH_METHOD, VT_VARIANT, &varRet, params, L"test"); 17 18 varRet.ChangeType(VT_BSTR); 19 AfxMessageBox(TEXT("返回值是:") + CString(varRet.bstrVal)); 20 }