本文演示了使用COM组件调用网页javascript的两种方法,第一种方法无法获取javascript的返回值,方法比较简单;第二种方法需要MSHTML库的支持,可以获取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 }
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 }