ActiveX Calling JavaScript

原创 2011年01月09日 14:03:00

Title: ActiveX Calling JavaScript I have an ActiveX control used on the web build under MFC. I want to be able to call a javascript funtion on the webpage the control is hosted. How do I do this? You can use execScript method of the IHTMLWindow2 interface. Using GetControlUnknown you retrieve IUnknown interface of the browser object. Then you should do QueryInterface for IWebBrowser2 interface. Then call IWebBrowser2::get_Doccument to obtain an IHTMLDocument2 interface pointer and then call IHTMLDocument2::get_parentWindow to obtain a pointer to the IHTMLWindow2 interface.

 

ActiveX如何调用 网页中的JavaScript函数(转)

2006/3/27 17:33:38
P {margin:0px;padding:0px;} body {font-size:10pt;font-family:Tahoma;}

原始地址 http://www.qqread.com/vc/s820575020.html

前言

  很多网友问到,在HTML的页面中放置一个COM对象,这个对象该如何调用页面中的脚本函数的问题,本人近日也因为工作需要实现这样的功能,在网上搜索后,获得了很多帮助,但并没有发现完整的实现。本文描述了实现过程中的几个要点,同时提供一个示例工程的下载。

1——
  给接口添加一个方法:
  方法名:SetClientSite
  参数:IOleClientSite* pClientSite

2——
  给上面的方法加以实现(在相应的类中实现,已经自动生成了框架):
  STDMETHODIMP CIrDav::SetClientSite(IOleClientSite * pClientSite)
  {
   // TODO: 在此添加实现代码
   HRESULT hr = S_OK;
   IServiceProvider *isp, *isp2 = NULL;
   if (!pClientSite)
   {
    COMRELEASE(m_spBrowser);
   } 
   else
   {
    try
    {
     hr = pClientSite->QueryInterface(IID_IServiceProvider, reinterpret_cast<void **>  (&isp));
     if (FAILED(hr))
      throw("");  

     hr = isp->QueryService(SID_STopLevelBrowser, IID_IServiceProvider,     reinterpret_cast<void **>(&isp2));
     if (FAILED(hr))
      throw("");
     hr = isp2->QueryService(SID_SWebBrowserApp, IID_IWebBrowser2,     reinterpret_cast<void **>(&m_spBrowser));
     if (FAILED(hr))
      throw("");
     hr=this->m_spBrowser->get_Document((IDispatch**)&m_spDoc);
     if(FAILED(hr))
      throw("");
    }
    catch(LPCTSTR lpszErr)
    {
     if(CString(lpszErr)!="")
      MessageBox(lpszErr);
     hr=S_OK;
    }
    catch(...)
    {
     MessageBox("未知错误");
     hr=S_OK;
    }
    COMRELEASE(isp);
    COMRELEASE(isp2);
   }
   return hr;
  }
 通过这步的操作,我们就获得了控件所在Web页面的BROWSER对象指针和相应的DOCUMENT对象指针。
 通过这些BROWSER和DOCUMENT对象指针,我们可以设置窗口的很多属性,比如菜单、全屏、工具栏等的显示和DOCUMENT的背景颜色等等。
 这个方法参见 MSDN:http://support.microsoft.com/support/kb/articles/Q257/7/17.ASP


3——
  获得脚本,通过m_spDoc(DOCUMENT对象)的方法get_Script可以获得页面中的脚本对象:
  CComPtr<IDispatch> pScript;
  hr=this->m_spDoc->get_Script(&pScript);

4——
  检索函数,使用上面脚本对象的GetIDsOfNames可以获取页面之中指定名的脚本函数的指针:
  CComBSTR bstrMember("calert");
  DISPID dispid;
  hr=pScript->GetIDsOfNames    (IID_NULL,&bstrMember,1,LOCALE_SYSTEM_DEFAULT,&dispid);

5——
  调用脚本对象的Invoke方法执行脚本函数:
  DISPPARAMS dispparams;
  memset(&dispparams, 0, sizeof dispparams);
  dispparams.cArgs = 2;
  dispparams.rgvarg = new VARIANT[dispparams.cArgs];
 
  for( int i = 0; i < 2; i++)
  {
   CComBSTR bstr = "111"; // back reading
   bstr.CopyTo(&dispparams.rgvarg[i].bstrVal);
   dispparams.rgvarg[i].vt = VT_BSTR;
  }

  dispparams.cNamedArgs = 0;
  EXCEPINFO excepInfo;
  memset(&excepInfo, 0, sizeof excepInfo);
  CComVariant vaResult;
  UINT nArgErr = (UINT)-1;  // initialize to invalid arg
  hr = pScript->Invoke  (dispid,IID_NULL,0,DISPATCH_METHOD,&dispparams,&vaResult,&excepInfo,&nArgErr);


  这里的执行中我随意的写了几个参数,可以根据自己需要修改。
本示例的触发:打开相应的HTM页面,点击发送按钮,按钮调用脚本函数btn,btn调用了COM中的函数KeyPress函数,在KeyPress函数中获取calert函数并调用。

  注:一个问题:
  获得BROWSER对象是在SetClientSite函数中实现,这个函数我了解不多,我想应该是系统自动运行的函数之一,但当我使用这个函数后,原先我在COM中定义的事件(比如CLICK事件)不能响应。有高手介绍说放置在别的地方,我想应该是可以的,比如找一个COM就绪的函数进行处理,但不知IOleClientSite*pClientSite又该如何获得。


  本工程是用.NET2003弄的,可能你们系统不支持,不过没有关系,重要建立自己的COM工程后,把IrDav的相关文件包含添加到工程就可以了。

  对不起,由于本人没有非常稳定空间,不能提供下载,如果有需要,请给本人QQ(68558710)或MSN(Triout@msn.com)或EMail(Triout@163.com)联系。如果您有空间,请告知,以便上传后提供连接。

ActiveX Calling JavaScript

Q: I have an ActiveX control used on the web build under MFC.  I want to be able to call a javascr...
  • shybt
  • shybt
  • 2010年12月24日 22:36
  • 352

Activex和javaScript结合使用

http://download1.csdn.net/down3/20070613/13093058219.rar由于项目的需要,将一组事务封装成Activex控件(使用传统的delphi),总结来前人...
  • liuzuofei
  • liuzuofei
  • 2007年06月13日 09:31
  • 984

如何从ActiveX控件向JavaScript传递数组

        从ActiveX控件向JavaScript传递数组似乎不是一件容易的事,因为JavaScript好像不能接受从ActiveX控件传来的引用参数,所以实际上我并没有找到直接传递的方案(如...
  • txjchen
  • txjchen
  • 2006年04月28日 23:16
  • 3799

activex与前台JS交互

以下Demo演示如何在activex中与前台的js进行交互: activex中: private mshtml.HTMLWindow2Class window = null...
  • guchuanlong
  • guchuanlong
  • 2014年06月15日 00:31
  • 1060

js传递数组参数到ActiveX

//JS                                     function sendMsg()     {         var...
  • wxdvc
  • wxdvc
  • 2013年01月22日 10:34
  • 3462

Error: Error calling method on NPObject. 解决办法

一般情况你可以先添加以下几句试试: Security.allowDomain("*"); Security.allowInsecureDomain("*"); 如...
  • TsubasaDaKong
  • TsubasaDaKong
  • 2014年07月11日 09:36
  • 14377

ActiveX回调js函数 之 变量调用

ActiveX回调js函数 之 变量调用 1、在VC6.0下创建一个MFC ActiveX工程,此处滤过具体步骤。 2、添加外部调用的变量OnDataIn,步骤如下:              ...
  • youyongyoumou
  • youyongyoumou
  • 2016年09月18日 17:12
  • 1032

JavaScript如何触发ActiveX控件的事件,并得到事件中的参数

最近在使用公司购买的一款图形ActiveX控件,开发web端时遇到一个问题:JavaScript如何触发ActiveX控件的事件,并得到事件中的参数。在谷歌和百度上找了很多资料,感觉还是不清楚是如何触...
  • minminsu
  • minminsu
  • 2014年04月02日 16:24
  • 1291

activex和javascript交互(delphi版本)

利用Delphi的ActiveForm,可以很方便地开发出可以嵌入IE的ActiveX组件,无需知道太多幕后的COM知识。如何使得OCX可以很方便地调用Web上的JavaScript函数呢,研究了一个...
  • w809026418
  • w809026418
  • 2011年04月18日 14:22
  • 3316

ActiveX , NPAPI 如何回调js代码

1.IE 插件 1)   自己定义个CComDispatchDriver 变量保存页面传过来的JS函数:       CComDispatchDriver  m_SaveJSFun; ...
  • wuxinyanzi
  • wuxinyanzi
  • 2014年10月10日 09:17
  • 1949
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ActiveX Calling JavaScript
举报原因:
原因补充:

(最多只允许输入30个字)