如何从 VC WebBrowser 应用程序中调用脚本函数
为了调用脚本函数存在的网页上,您必须使用自动化 ; 换句话说,IDispatch。 使用以下步骤来调用脚本函数从 Visual C++ 应用程序的网页上存在的:
- 获取在 HTML 文档的 IDispatch。
- 调用利用 IDispatch:: GetIDsOfNames 获取脚本函数的 ID。
- 调用 IDispatch:: Invoke 执行该函数。
下面的 Visual C++ 源代码演示如何在您自己的应用程序中对此进行实现。 此代码使用智能指针由 # import 语句。 必须在中您源的代码文件最好 stdafx.h 之一包含此 # import 语句:
#import "C:/winnt/system32/mshtml.tlb" // location of mshtml.tlb
void CMyClass::ExecuteScriptFunction()
{
// m_WebBrowser is an instance of IWebBrowser2
MSHTML::IHTMLDocument2Ptr spDoc(m_WebBrowser.GetDocument());
if (spDoc)
{
IDispatchPtr spDisp(spDoc->GetScript());
if (spDisp)
{
// Evaluate is the name of the script function.
OLECHAR FAR* szMember = L"evaluate";
DISPID dispid;
HRESULT hr = spDisp->GetIDsOfNames(IID_NULL, &szMember, 1,
LOCALE_SYSTEM_DEFAULT, &dispid);
if (SUCCEEDED(hr))
{
COleVariant vtResult;
static BYTE parms[] = VTS_BSTR;
COleDispatchDriver dispDriver(spDisp, FALSE);
dispDriver.InvokeHelper(dispid, DISPATCH_METHOD, VT_VARIANT,
(void*)&vtResult, parms,
"5+Math.sin(9)");
}
}
}
}
以下是为包含求函数的网页的 HTML:
<HTML>
<HEAD>
<TITLE>Evaluate</TITLE>
<SCRIPT>
function evaluate(x)
{
alert("hello")
return eval(x)
}
</SCRIPT>
</HEAD>
<BODY>
</BODY>
</HTML>
示例2
- BOOL CallJScript(const wchar_t * func, VARIANT * vtParams, int cNumberOfParam, VARIANT * vtResult)
- {
- if(!func || !func[0])
- return FALSE;
- CComPtr<IDispatch> spScript;
- spScript = GetJScript();
- if(!spScript)
- return FALSE;
- DISPID dispID = NULL;
- CComBSTR bstrFunc(func);
- HRESULT hr = spScript->GetIDsOfNames(IID_NULL, &bstrFunc, 1, LOCALE_SYSTEM_DEFAULT, &dispID);
- if(FAILED(hr))
- return FALSE;
- DISPPARAMS dispParams = {0};
- dispParams.cArgs = cNumberOfParam;
- dispParams.rgvarg = new VARIANT[cNumberOfParam];
- for(int i = 0; i < cNumberOfParam; ++i)
- {
- VariantInit(&dispParams.rgvarg[i]);
- VariantCopy(&dispParams.rgvarg[i], &vtParams[cNumberOfParam - 1 - i]);
- }
- hr = spScript->Invoke(dispID, IID_NULL, 0, DISPATCH_METHOD, &dispParams, vtResult, NULL, NULL);
- delete [] dispParams.rgvarg;
- if(FAILED(hr))
- return FALSE;
- return TRUE;
- }
- IHTMLDocument2 * GetIDocument2()
- {
- if(!m_pWebBrowser2) return NULL;
- IDispatch *pIDispatch = NULL;
- if (SUCCEEDED(m_pWebBrowser2->get_Document(&pIDispatch)) && pIDispatch)
- {
- IHTMLDocument2 *pIDocument2 = NULL;
- if (SUCCEEDED(pIDispatch->QueryInterface(IID_IHTMLDocument2, (void**)&pIDocument2)))
- {
- pIDispatch->Release();
- return pIDocument2;
- }
- pIDispatch->Release();
- }
- return NULL;
- }
- IDispatch * GetJScript()
- {
- CComPtr<IHTMLDocument2> doc;
- doc = GetIDocument2();
- if(!doc)
- return NULL;
- IDispatch * dsScript = NULL;
- HRESULT hr = doc->get_Script(&dsScript);
- if(SUCCEEDED(hr) && dsScript)
- return dsScript;
- else
- return NULL;
- }