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

薸薸湸湸

薸薸湸湸

2016-02-19 13:58

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

 前言

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

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

  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);

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

  这里的执行中我随意的写了几个参数,可以根据自己需要修改。

 本示例的触发:打开相应的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)联系。如果您有空间,请告知,以便上传后提供连接。

展开更多 50%)
分享

猜你喜欢

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

编程语言 网络编程
如何调用ActiveX网页中的JavaScript函数

JavaScript写作技巧,函数A中调用函数B, 怎样在函数B中写代码中断

Web开发
JavaScript写作技巧,函数A中调用函数B, 怎样在函数B中写代码中断

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

JavaScript中small函数

Web开发
JavaScript中small函数

JavaScript与ActionScript函数相互调用

Web开发
JavaScript与ActionScript函数相互调用

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

JavaScript中splice函数

Web开发
JavaScript中splice函数

JavaScript函数调用的四个规则

Web开发
JavaScript函数调用的四个规则

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

UBB 转换函数演示 (经典论坛)

UBB 转换函数演示 (经典论坛)

痛` 并哭过゛ 夕` 并伤过 - QQ伤感分组

痛` 并哭过゛ 夕` 并伤过 - QQ伤感分组
下拉加载更多内容 ↓