CDHtmlDialog探索----Javascript与窗体交互

摘要:
CDHtmlDialog探索——Javascript和表单交互CDHtml Dialog提供C++和Web页面之间的双向交互。通过这个系统,简单的宏调用可以直接将网页中每个元素的事件映射到C++程序,而在网页中调用C++函数代码则不那么简单。通常,它放在表单的构造函数EnableAutomation()中;当然,它也可以放在OnInitDialog中,但要注意顺序。调用不应晚于调用SetExternalDispatch。通常,它被放置在OnInitDialog事件中。设置外部调度;这里使用IDispatch接口。因此,必须确保在SetExternalDispatch之前调用EnableAutomation。

CDHtmlDialog探索----Javascript与窗体交互

CDHtmlDialog提供了C++与网页的双向交互,通此一系统简单的宏调用可以把网页中各元素的事件直接映射到C++程序中,而在网页中调用C++功能代码就显的不那么直观了。归根结底交互的基理就是实现相应COM接口。实现方式如下:

1、在窗体初始化时调用EnableAutomation函数。

通常情况下是放在窗体的构造函数中,

EnableAutomation();

当然也可以放在OnInitDialog中,不过要注意顺序,其调用不应该晚于对SetExternalDispatch的调用。此函数在底层的实现就是引用到正确的IDispatch接口(实际就是定位了相应的vtable指针),IDispatch是OLE自动化程序实现的根基。

2、在窗体初始化时调用SetExternalDispatch函数。

通常情况下放在OnInitDialog事件中。

SetExternalDispatch(GetIDispatch(TRUE));

在这个地方就用到了IDispatch接口。所以必须保证EnableAutomation是在SetExternalDispatch之前调用。调用此函数是对网页公布其窗口容器的接口从而在网页中可以通过window.external来调用窗口容器公布的函数、事件、属性。

3、在头文件中添加DECLARE_DISPATCH_MAP()

这个宏定义了对外公布信息需要使用的一些内部数据结构和操作。

4、在实现文件中(*.cpp)添加具体的信息映射

BEGIN_DISPATCH_MAP(CBrowserDlg, CDHtmlDialog) DISP_FUNCTION(CBrowserDlg,"testfun",TestFunction,VT_EMPTY,VTS_VARIANT VTS_VARIANT) END_DISPATCH_MAP()

testfun是对网页公布的函数名称,TestFunction是在CBrowserDlg的成员函数,VT_EMPTY表示此函数没有返回值,VTS_VARIANT表示函数参数,多个参数之间使用空格。需要注意的一点是js或vbs这类的脚本语言的数据类型都对应于COM中的变体类型,假如说testfun函数传递两个参数分别是整型和字符串类型(示例中的两个参数都当做字符串来处理),在定义的时候可以使用VTS_I4和VTS_VARIANT来表示这两个参数的类型,虽然VTS_PBSTR是用于表示字符串的但却不对应脚本语言的字符串类型所以应该使用VTS_VARIANT,使用VTS_VARIANT来代替VTS_I4也是正确的。其它复杂数据类型比如说对象等都应用使用VTS_VARIANT数据类型表示。

5、实现对外公布的函数(在此示例中是TestFunction)

1
2
3
4
5
6
7
8
9
10
void CBrowserDlg::TestFunction(VARIANT& vStr1,VARIANT& vStr2)
{
CComVariant varStr1(vStr1),varStr2(vStr2);
varStr1.ChangeType(VT_BSTR);
varStr2.ChangeType(VT_BSTR);
USES_CONVERSION;
CString strMsg;
strMsg.Format(_T("varStr1:%s,varStr2:%s"),OLE2T(varStr1.bstrVal),OLE2T(varStr2.bstrVal));
AfxMessageBox(strMsg);
}

6、在网页中调用窗体容器公布的函数

1
<script language="javascript"type="text/javascript"><br>// <!CDATA[<br> window.external.testfun("one","two");<br>// ]]><br> </script><br>

7、重写IsExternalDispatchSafe虚函数

重写此函数可以屏蔽掉网页弹出的ActiveX安全警告对话框。重写CanAccessExternal函数也可以达到同样的目的,但是不推荐这样做,CanAccessExternal中调用IsExternalDispatchSafe并在其值为FALSE时默认做了安全检查,如果重写了此函数那么就破坏了CDHtmlDialog的封装,并且想要再重新获得安全性时就显的不太方便了。

免责声明:文章转载自《CDHtmlDialog探索----Javascript与窗体交互》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Arraylist(变长list) 及 定长list的基本使用POI解析word文件,并为特定规则的key替换值下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

让 Winform 窗口悬浮的简单方式

很多次设置这个 TopMost 属性会莫名的不起作用,有时又可以。一直在想是为什么会这样? 后来多次尝试,发现这个属性必须在窗体某些其他属性后设置,比如在 Height、Width 这样的属性后。 看了下 Windows 窗体应用程序启动时,主窗体的启动事件将按照以下顺序引发: Control.HandleCreatedControl.BindingCon...

wireshark源码分析二

一、源代码结构 在wireshark源代码根目录下,可以看到以下子目录: 1)物理结构     其中,epan文件夹负责所有网络协议识别工作,plugins里面存放了wireshark所有插件,gtk文件夹里面是wireshark的界面部分代码,其余文件夹没有单独研究。 2)逻辑结构     下图给出了Ethereal功能模块:    a) GTK1/2...

JavaScript的三种代码书写格式

  在这里我将 JavaScript 的类与 Java(本人主要是做Java开发的) 的类做一个比较,以便大家能够更好的理解。   1. 在没有接触 JS 的面向对象编程之前,写JS的函数都是像下面这样写的: function test(){     var v1 = "test";     var v2 = "value";     if(v1=="te...

网络socket编程实现并发服务器——多线程编程

一、多线程简介1、什么是线程?       线程在操作系统原理中是这样描述的:线程是进程的一条执行路径。线程在Unix系统下,通常被称为轻量级的进程,线程虽然不是进程,但却可以看作是Unix进程的表亲,所有的线程都是在同一进程空间运行,这也意味着多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调...

XMLHTTP使用具体解释

XMLHTTP对象是Microsoft的MSXML开发包中带的一个用HTTP,XML协议訪问web资源的对象. 从MSXML3.0開始出现. 它在AJAX技术中主要用来从其它网络资源获取信息,然后由javascript来更新页面中的部分内容. 採用这样的方法将页面可更新内容细化,不须要更新非常少的内容而刷新整个页面.   XMLHTTP对象的用法例如以...

VS2010几款超赞的扩展辅助工具总结

VS2010几款超赞的扩展辅助工具总结 前言    前两天刚把公司电脑系统和开发环境的重新安装http://www.cnblogs.com/aehyok/p/3603149.html,主要是由于公司电脑配置稍微低了一些,运行、调试太慢,又因为要做新的项目了,想让自己的开发效率稍微高点,所以重新重新安装。虽然VS2010IDE功能已经非常强大了,但是在有些地...