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

active|activex|javascript|函数|网页

 
前言

很多网友问到,在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)联系。如果您有空间,请告知,以便上传后提供连接。

时间: 2024-07-29 08:42:19

ActiveX如何调用引用该ActiveX的网页中的JavaScript函数的相关文章

软件开发-安卓,jsoup,解析网页中的javascript的内容,提取信息

问题描述 安卓,jsoup,解析网页中的javascript的内容,提取信息 开发-安卓,jsoup,解析网页中的javascript的内容,提取信息-jsoup解析javascript"> 这个是网页地址:http://www.bilibili.com/mobile/subchannel.html#tid=33 以下是抓取到的网页源码,以图片发出,实在不好意思了,可是好像因为这个而发不出来了,现在安全起见还是以图片的形式发出,或者可以上该链接获取,我是用ie仿真为windows phon

ASP.NET 后台如何调用前台引用的JS文件中的javascript函数??

问题描述 如题,我前台引用了JS文件,javascript函数写在里面.现在我在后台使用Response.Write(JS函数)来调用JS文件中的函数,编译调试的时候提示我要调用的函数不存在,请教下我该怎么做才能够在后台调用JS文件中我需要的函数. 解决方案 解决方案二:<HEAD><scriptlanguage="javascript"src="xxx.js"charset="gb2312"></script>

利用defer关键字让网页中的javascript推迟执行

我们有时候会在网页中的<script>段中看到defer关键字,那么它到底是派什么用处呢? defer从字面意思上来看就是延迟,推迟的意思.它的目的在于: 让浏览器在下载脚本的时候就不必立即对其进行处理,而是继续对页面进行下载和解析, 等到全部页面下载完成后执行JS脚本.这样做有时候能够提高下载的性能. 那么defer的应用有什么呢?   我们经常会用innerHTML来动态给DOM元素加载JS,比如:object.innerHTML = "<script" + &q

c#如何调用一个网页中的函数使其在vs2010中调试

问题描述 考虑到浏览器兼容问题,要用webkitbrowser来调用.这是我vs2010下的一个窗体程序,我首先用webkitbrowser调用了网页中的用户名和密码,我故意设置一个错误的密码来调试,结果本来应该在第一个截图的窗体中出来警告对话框,却在第二个截图中出现了,第二个截图其实是浏览器网页上的,我的问题就是如何调用网页中的登录函数到vs中,进行修改,让警告的窗口出现在我vs中制作的窗体中,也就是第一个截图中.在解释一遍,第二个截图是网页,第一个截图是vs中的窗体程序,怎么把第二个截图中的

在HTML网页中巧用URL

网页 首先,,先放出一个地址给大家测试 http://cnbruce.com/test/htmlpro/?name=cnbruce&email=cnbruce@126.com 1,时下流行的(可能是吧,因为最近问的人比较多)就是没有任何文件名的URL地址.比如htmlpro/?其实这和服务器设置的默认文件名有关,比如index.htm,index.html,index.asp等等,不信你试试我朋友的一个(asp的). http://www.windsn.com/blog/?viewType=by

网页中flash的trace方法输出数据

我的js类jdhcn.js中的一个flashDebug方法: 功能: flash的调用些方法能在网页中看到flash的trace方法输出的数据: 方法: 1.init(w,h,z);//w为显示界面的宽度,h为显示界面的高,z为层级(最好放在最顶层):<此方法可以省略> 2.trace(str);//要输出的数据. 使用: 1.把jdhcn.js导入,点击下载jdhcn.js. 2.在body里可以重写一个函数(也可以不写). 程序代码: 以下为引用的内容: <script langua

问题解决:如何让网页中的Flash影片全屏?

解决|网页|问题 Flash Player 9在网上流行了很长一段时间了.在以往版本的 Flash Player 当中要想实现网页中Flash影片全屏就必须借助 Javascrīpt 来实现.但对于 Flash Player 9来说,就无须如此麻烦Adobe为其加入了浏览器 Flash 影片全屏模式的功能.据说:全屏模式主要是针对 Flash 视频和 Flash 应用的显示需求而增加的.通过它就可以很容易的通过AS来控制网页中Flash影片的全屏播放. 下面是一个全屏范例,下载解压后,打开.ht

.net中前台javascript与后台c#函数相互调用问题_C#教程

C#代码与javaScript函数的相互调用 问: 1.如何在JavaScript访问C#函数? 2.如何在JavaScript访问C#变量? 3.如何在C#中访问JavaScript的已有变量? 4.如何在C#中访问JavaScript函数? 问题1答案如下: javaScript函数中执行C#代码中的函数: 方法一:1.首先建立一个按钮,在后台将调用或处理的内容写入button_click中;         2.在前台写一个js函数,内容为document.getElementById("

C#代码与javaScript函数的相互调用

问: 1.如何在JavaScript访问C#函数? 2.如何在JavaScript访问C#变量? 3.如何在C#中访问JavaScript的已有变量? 4.如何在C#中访问JavaScript函数? 问题1答案如下: javaScript函数中执行C#代码中的函数: 方法一:1.首先建立一个按钮,在后台将调用或处理的内容写入button_click中; 2.在前台写一个js函数,内容为document.getElementById("btn1").click(); 3.在前台或后台调用