ActiveX如何调用引用该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又该如何获得。
转载于:https://www.cnblogs.com/Daview/archive/2004/05/06/8380.html
ActiveX如何调用引用该ActiveX的网页中的JavaScript函数相关推荐
- JavaScript程序基础(一)网页中引入Javascript的三种方法
JavaScript是一种基于对象的脚本编程语言,具有动态.跨平台.基于对象和安全等特性.它不需要经过编译,而是直接嵌入在HTML页面中运行,可把单纯的HTML页面转变成支持用户交互和事件响应的动态页 ...
- 网页中插入javascript的几种方法
网页中插入javascript的方法常见的有两种: 一.直接使用html标记 JavaScript 可以出现在 html的任意地方.使用标记<script>-</script> ...
- ActiveX控件打包成Cab置于网页中自动下载安装
From: http://www.iteye.com/topic/110834 makeCAB.rar (188.5 KB) [背景] 做过ActiveX控件的朋友都知道,要想把自己做的ActiveX ...
- ActiveX控件打包成Cab置于网页中自动下载安装 (收藏未实践测试)
from http://blog.csdn.net/htqlhy/article/details/7937897?locationNum=12 [背景] 做过ActiveX控件的朋友都 ...
- ActiveX控件打包成Cab置于网页中自动下载安装(转载)
原文出自http://www.iteye.com/topic/110834 [背景] 做过ActiveX控件的朋友都知道,要想把自己做的ActiveX控件功能放在自己的网页上使用,那么用户在客户端就必 ...
- Android 嵌套H5 网页,图片上传无法调用手机图片以及嵌套网页中无法调用另一款APP问题记录
最近项目中用到安卓原生APP 嵌套H5网页,使用安卓原生WebView实现,主要遇到以下两种问题,特此记录: 在H5页面,返回直接回到APP中 监听安卓的返回事件就行了 @Override publi ...
- 在HTML网页中书写JavaScript
参考书籍:<JavaScript 权威指南----ECMAScript5+HTML5DOM+HTML5BOM>编著:张亚飞 1.使用<script>元素定义JavaScript ...
- 网页中的load函数
这个函数的作用是获取内容,我们可以从一个txt文本中获取里面的内容 <!DOCTYPE html> <html> <head> <meta chars ...
- 网页中嵌入JavaScript+事件触发程序
嵌入方式: 1.JavaScript代码与HTML写在同一个文档中 JavaScript代码要放在<script>和</script>标签之间 而且整个JavaScript代码 ...
- 如何在一个frame中调用另一个frame中的javascript函数
1.htm <script language="javascript"> function test() { alert("测试") } </ ...
最新文章
- Github代码版本控制可视化教程—Git Gui的使用
- 应用栈求解迷宫问题(C++实现)
- java结束全部操作代码_Java基本的线程操作(附代码)
- GCCEE全球华人电脑教育应用大会
- 如何找到点击Object ID 白屏问题的root cause
- python控制手机自动刷新闻_python +adb控制手机自动化签到
- Sangmado 公共基础类库
- word List 30
- 测试人员如何搭建自动打包部署平台?(具体详细步骤及下载地址)
- Spark之性能优化(重点:并行流数据接收)
- obs之libfaac编码
- C语言实现约瑟夫环代码
- led数字字体_led电视质量排行榜
- Java中的数据类型
- 尘世了了 花开花落昔年同
- UE4入门序列08(Unreal制作MMO游戏范围巡逻AI)
- matlab语音合成技术,matlab语音合成详细版
- 【转】电子毕业设计题目
- 【Typora图床设置】Typora图片上传和阿里云OSS对象存储
- python 把汉字转化为拼音-Python汉字转换成拼音
热门文章
- OC小实例关于init方法不小心的错误
- rsync同步目录及同步文件
- 爬楼梯算法-java(递归与非递归)
- python mysql创建表日期型_python 操作mysql,按照当前时间建立表,无法创建表..
- mysql gitd 数据结构同步失败_mysql 5.7 gtid主从同步错误修复
- js高级学习笔记(b站尚硅谷)-1-数据类型
- php fseek函数,在php中fseek函数起什么作用呢?
- emq mysql消息存储_EMQ X 规则引擎系列(二)存储消息到 MySQL 数据库
- spark保存数据到hbase_Spark读取Hbase中的数据
- xgboost安装_机器学习笔记(七)Boost算法(GDBT,AdaBoost,XGBoost)原理及实践