有时候,当我们正在使用的C内的IE浏览器控制+ +应用程序,我们需要访问HTML元素。我们可以通过使用诸如IWebBrowser2,IHTMLDocument2标准的COM对象它,等等。这样,我们很容易可以实现如点击按钮,单击定位,获得输入的字符串,获取HTML文本功能,等等。不幸的是,微软并没有提供类似的JavaScript对象。在任何情况下,它可以通过使用传统的COM方式为HTML页内的JavaScript对象的控制。本文介绍的类CWebPage,允许您做一个技术,从C调用JavaScript函数+ +代码。
由于使用的结果所提出的类,它很容易从C调用任何JavaScript函数+ +代码。要实现此功能,我们应该得到的指针IHTMLDocument2接口。如果我们使用的是从MFC的CHtmlView类,我们可以通过使用一个成员函数CHtmlView::GetHtmlDocument()。在使用IWebBrowser或IWebBrowser2组件的情况下,功能get_Document将使我们想要的界面。下面是一个例子:
CComPtr<IDispatch> spDisp = CHtmlView::GetHtmlDocument(); m_webPage.SetDocument(spDisp);
The rest of the things will be done by the CWebPage
class. Here is an example of a JavaScript call without parameters.
m_webPage.CallJScript("Welcome");
The example of the JavaScript call with two parameters will look like this:
m_webPage.CallJScript("Miltiply","2.34","3.32");
The Class Implementation
class CWebPage { public: CWebPage(); virtual ~CWebPage(); bool SetDocument(IDispatch* pDisp); LPDISPATCH GetHtmlDocument() const; const CString GetLastError() const; bool GetJScript(CComPtr<IDispatch>& spDisp); bool GetJScripts(CComPtr<IHTMLElementCollection>& spColl); CString ScanJScript(CString& strAText,CStringArray& args); bool CallJScript(const CString strFunc); bool CallJScript(const CString strFunc,const CString strArg1); bool CallJScript(const CString strFunc,const CString strArg1, const CString strArg2); bool CallJScript(const CString strFunc,const CString strArg1, const CString strArg2,const CString strArg3); bool CallJScript(const CString strFunc,const CStringArray& paramArray); protected CComPtr<IHTMLDocument2> m_spDoc; }; 调用技术在前面提到的技术拆分以下步骤:获取一个指向IHTMLDocument2接口。
获取一个在HTML文件中的JavaScript对象的IDispatch。使用了一个JavaScript函数名字的DISPID。把参数给DISPPARAM结构。调用JavaScript的使用IDispatch接口的Invoke方法的功能。下面是一个得到一个IDispatch指针的Java脚本对象的例子:
bool CWebPage::GetJScript(CComPtr<IDispatch>& spDisp) { HRESULT hr = m_spDoc->get_Script(&spDisp); ATLASSERT(SUCCEEDED(hr)); return SUCCEEDED(hr); }
And here is the final function to call JavaScript:
CComVariant CWebPage::CallJScript(const CString strFunc, const CStringArray& paramArray) { //Getting IDispatch for Java Script objects CComPtr<IDispatch> spScript; if(!GetJScript(spScript)) { ShowError("Cannot GetScript"); return false; } //Find dispid for given function in the object CComBSTR bstrMember(strFunc); DISPID dispid = NULL; HRESULT hr = spScript->GetIDsOfNames(IID_NULL,&bstrMember,1, LOCALE_SYSTEM_DEFAULT,&dispid); if(FAILED(hr)) { ShowError(GetSystemErrorMessage(hr)); return false; } const int arraySize = paramArray.GetSize(); //Putting parameters DISPPARAMS dispparams; memset(&dispparams, 0, sizeof dispparams); dispparams.cArgs = arraySize; dispparams.rgvarg = new VARIANT[dispparams.cArgs]; dispparams.cNamedArgs = 0; for( int i = 0; i < arraySize; i++) { CComBSTR> bstr = paramArray.GetAt(arraySize - 1 - i); // back reading bstr.CopyTo(&dispparams.rgvarg[i].bstrVal); dispparams.rgvarg[i].vt = VT_BSTR; } EXCEPINFO excepInfo; memset(&excepInfo, 0, sizeof excepInfo); CComVariant vaResult; UINT nArgErr = (UINT)-1; // initialize to invalid arg //Call JavaScript function hr = spScript->Invoke(dispid,IID_NULL,0, DISPATCH_METHOD,&dispparams, &vaResult,&excepInfo,&nArgErr); delete [] dispparams.rgvarg; if(FAILED(hr)) { ShowError(GetSystemErrorMessage(hr)); return false; } return vaResult; }
http://www.codeguru.com/Cpp/I-N/ieprogram/article.php/c4399