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

2016-02-19 13:58 16 1 收藏

给自己一点时间接受自己,爱自己,趁着下午茶的时间来学习图老师推荐的如何调用ActiveX网页中的JavaScript函数,过去的都会过去,迎接崭新的开始,释放更美好的自己。

【 tulaoshi.com - 编程语言 】

 前言

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  很多网友问到,在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_castvoid **  (&isp));
     if (FAILED(hr))
      throw("");
     hr = isp-QueryService(SID_STopLevelBrowser, IID_IServiceProvider,     reinterpret_castvoid **(&isp2));
     if (FAILED(hr))
      throw("");
     hr = isp2-QueryService(SID_SWebBrowserApp, IID_IWebBrowser2,     reinterpret_castvoid **(&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可以获得页面中的脚本对象:
  CComPtrIDispatch 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函数并调用。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  注:一个问题:

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

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

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

来源:http://www.tulaoshi.com/n/20160219/1605824.html

延伸阅读
标签: Web开发
看个例子: 1  代码如下: function a(){      alert("我是脚本之家");  }  2   代码如下: var a = function(){      alert("我是脚本之家");  }         1和2的方法是等价的...
m_ReUrl.Format("javascript:CategHandle('%d','%s','%d','yes')",                 g_nGroupIndex + 1,dlg.m_vFileGroup[g_nGroupIndex].strGroup,dlg.m_vFileGroup.size());     CComPtrIDispatch ppDisp = NULL; ...
标签: Web开发
在Javascript中,数学方法可以分成以下几类: constans(常数)、power functions(乘方函数)、trigonometic functions(三角函数)、rounding functions(舍入函数)、random numbers(随机数字) 引用 常数和乘方函数 Math.E  自然对数的底(为常数)  2.718   Math.LN10 &nbs...
标签: Web开发
概述 函数是进行模块化程序设计的基础,编写复杂的Ajax应用程序,必须对函数有更深入的了解。JavaScript中的函数不同于其他的语言,每个函数都是作为一个对象被维护和运行的。通过函数对象的性质,可以很方便的将一个函数赋值给一个变量或者将函数作为参数传递。在继续讲述之前,先看一下函数的使用语法: function func1(…){…} var...
标签: Web开发
JavaScript中splice函数方法是从一个数组中移除一个或多个元素,如果必要,在所移除元素的位置上插入新元素,返回所移除的元素。 其中arrayObj必选项。一个 Array 对象。 start是必选项。指定从数组中移除元素的开始位置,这个位置是从 0 开始计算的。 deleteCount是必选项。要移除的元素的个数。 item1, item...

经验教程

229

收藏

60
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部