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     }
posted @ 2012-10-10 11:20  特洛伊人  阅读(3041)  评论(0编辑  收藏  举报