从C调用JavaScript函数代码。

来源:互联网 发布:淘宝买高压气瓶犯法吗 编辑:程序博客网 时间:2024/06/10 21:24


有时候,当我们正在使用的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



转自:http://blog.csdn.net/jacklhf/article/details/4631698

                                             
0 0
原创粉丝点击