为什么要让VC与JavaScript交互?

1.有时候我们须要让自己的软件打开一个网页。来获取页面上的一些数据。

这时,能够用mshtml解析HTML提取出数据。也能够向HTML文档动态写入我们准备好的JS代码,用JS代码获取HTML上的数据,然后用VC调用该JS代码取得数据。

2.有时候我们须要让自己的软件打开一个网页并操控该网页,填写表单,提交等动作。这时。能够用mshtml操作HTML,给文本框赋值,模拟点击button。

也能够向HTML文档动态写入我们准备好的JS代码,用JS代码实现填单,提交等动作,然后用VC调用一下JS代码就可以。

3.有时候我们须要用HTML网页做界面。用JS管理HTML页面,用VC调用JS传递进数据。JS把这些数据通过HTML显示在界面上。CHtmlDialog正是这样的产物。

4.有时候我们须要基于HTTP协议与WEBserver直接交互。比方基于HTTP协议来登录QQ空间。可是对浏览器抓包发现QQ号是明文传输,但QQpassword是密文。它是怎样加密的呢?这些加密算法肯定都在页面上的JS里。由于这个加密过程是在客户浏览器上实现的。我们能够找到加密相关的JS代码,细致阅读分析。改写为C++代码实现,但比較复杂。一个简单的办法就是直接把这些用于加密的JS代码复制出来,用VC调用JS代码,让它的JS代码完毕加密过程。然后我们把密文拿过来,用HTTP协议POST发送到WEBserver,即完毕了登陆动作。

5.等等,还有非常多用途。

那么。在Windows平台上用VC开发的程序。怎样与JavaScript交互?

通常,我们都是用WebBrowser载入包括JS代码的HTML。然后通过WebBrowser对象获取IHTMLDocument接口(对于ActiveX的WebBrowser来说是get_Document方法,对于CHtmlView对象来说是GetHtmlDocument方法)。当中IHTMLDocument2接口有一个get_Script方法,能够获取用于控制JS代码的IDispatch接口。

VC调用JS函数,都是通过这个IDispatch接口的Invoke方法来完毕。使用IDispatch接口的GetIDsOfNames方法依据JS函数名获取调度标识符DISPID。使用Invoke来调用JS函数。Invoke最后两个參数用于返回错误信息。可为NULL。这个IDispatch接口调用起来非常麻烦,下文将会介绍怎样简便的调用。

网上有个外国人写了个CWebPage类实现VC与JS交互,用的正是这样的方法。

http://www.codeproject.com/Articles/2352/JavaScript-call-from-C

关于WebBrowser:

在VC中使用WebBrowser。一般有两种方法。

MFC中有个CHtmlView封装了WebBrowser,用起来非常方便。

尽管CHtmlView派生于CView,是个视图类。但它也派生于CWnd,将其用于对话框上。全然没有问题,仅仅是在某些地方须要小改动一下。当中须要注意的两个问题就是:

1. CHtmlView的构造函数是protected的,不同意直接构造一个CHtmlView对象。

必须从CHtmlView派生后再构造。

2.假设是在栈上创建CHtmlView对象,必须重载PostNcDestroy并什么也不写。

由于默认的PostNcDestroy会delete
 this;而出错。

假设是在堆上创建CHtmlView对象则要注意防止二次delete。

还有一种方法是使用WebBrowser的ActiveX控件。这样的方法能够在MFC项目中使用,也能够在非MFC项目中使用。

关于IDispatch:

我们知道IDispatch是COM双接口中的调度接口。一般用于供脚本语言调用COM组件。对于编译型的C++语言。让它调用这样的接口,是非常麻烦的。

毕竟用IDispatch接口调用COM对象的各种方法、设置与获取COM对象的属性、让COM对象回调我们,都是用IDispatch的Invoke方法来实现。一个Invoke就要实现那么多功能,用起来当然非常麻烦。

只是好在ATL智能指针类中的CComDispatchDriver(即CComQIPtr<IDispatch>)封装了IDispatch接口。使用我们用起来大大的方便!CComDispatchDriver对GetIDsOfNames和Invoke进一步进行了封装。仅仅需更少的參数即方便可调用。

获取和设置COM对象属性能够用CComDispatchDriver的这些方法:

GetProperty

GetPropertyByName

PutProperty

PutPropertyByName

事实上使用IDispatch调度接口来设置、获取COM属性。调用COM方法。都是使用GetIDsOfNames和Invoke。

实际上这四个方法都是对GetIDsOfNames和Invoke的封装。

简化调用的复杂性。

调用COM对象的方法能够用这些方法:

Invoke0    //调用0个參数的方法

Invoke1    //调用1个參数的方法

Invoke2    //调用2个參数的方法

InvokeN    //调用多个參数的方法

这些函数都有两个版本号,一个是接受调度标示符DISPID,须要自己先调用GetIDsOfNames来获取。

一个是接受OLE字符串的版本号,这个版本号在内部会调用GetIDsOfNames来获取DISPID。这些函数用起来非常方便,不须要我们自己填充DISPPARAMS结构,可是它对原始Invoke的调用时,最后两个參数都是NULL,即不须要获取错误信息。假设须要获取错误信息,我们须要自行调用原始Invoke方法。

注意。这些方法是ALT的CComDispatchDriver封装的方法,调用时应使用"."而不是"->"。由于"->"获得的是CComDispatchDriver内部的Dispatch指针。

还有一个要注意的问题是,一定要等Navigate全然载入一个html文档后(触发OnDocumentComplete)。才干获取IHTMLDocument2和Script。

否则会出现空指针或找不到JS函数。所以不能在调用Navigate打开HTML后就紧接着获取IHTMLDocument2和Script,要等HTML文档载入完。

个參数的JS函数,1个參数的JS函数。2个參数的JS函数,N个參数的JS函数。

说了那么多,下一篇文章,让我们来实际动手,用VC调用一下JS函数看看。


VC与JavaScript交互(一) ———— 怎样实现的更多相关文章

  1. VC与JavaScript交互(一) --- 如何实现

    为什么要让VC与JavaScript交互? 1.有时候我们需要让自己的软件打开一个网页,来获取页面上的一些数据.这时,可以用mshtml解析HTML提取出数据,也可以向HTML文档动态写入我们准备好的 ...

  2. VC与JavaScript交互(二) --- 调用JS函数

    这一章,我们来动手实践VC调用JS函数. 我们动手写一个HTML,其中包含这样一段JS代码: //[html] <script type="text/javascript"& ...

  3. VC与JavaScript交互(四) --- WebBrowser或CHtmlView中轻松屏蔽脚本错误(JavaScript)

    1.什么是javascript脚本错误 1.1    概述 JavaScript脚本错误包含“运行时错误”和“语法错误”. 1.2    JavaScript“语法错误” JavaScript语法错误 ...

  4. VC与JavaScript交互(三) --- CWebPage类调用javascript函数(给js函数传参,并取得返回值)

    ①需要一个别人写好的类CWebPage,将其对于的两个文件WebPage.h和WebPage.cpp添加到工程中. ②添加WebBrowser控件,在视图/对话框类的头文件中#include &quo ...

  5. Android混合开发之WebView与Javascript交互

    前言: 最近公司的App为了加快开发效率选择了一部分功能采用H5开发,从目前市面的大部分App来讲,大致分成Native App.Web App.Hybrid App三种方式,个人觉得目前以Hybri ...

  6. 移动端基于HTML模板和JSON数据的JavaScript交互

    写本文之前,我正在做一个基于Tab页的订单中心: 每点击一个TAB标签,会请求对应状态的订单列表.之前的项目,我会在js里使用 +  连接符连接多个html内容: var html = ''; htm ...

  7. 重新想象 Windows 8.1 Store Apps (80) - 控件增强: WebView 之基本应用, POST 数据, 与 JavaScript 交互

    [源码下载] 重新想象 Windows 8.1 Store Apps (80) - 控件增强: WebView 之基本应用, POST 数据, 与 JavaScript 交互 作者:webabcd 介 ...

  8. MongoDB源码分析——mongo与JavaScript交互

    mongo与JavaScript交互 源码版本为MongoDB 2.6分支     之前已经说过mongo是MongoDB提供的一个执行JavaScript脚本的客户端工具,执行js其实就是一个js和 ...

  9. Android WebView JavaScript交互

    今天介绍一下,Android中Webview与JavaScript的交互,首先是在布局文件里添加webview控件: <WebView android:id="@+id/webview ...

随机推荐

  1. Gym-101915J The Volcano Eruption 计算几何

    题面 题意:给你一个矩阵,然后有很多的圆,这些圆可能相交着,一个或者几个就导致这个矩形被分割开了,就是从最下面的边到上面的边,连线被这些圆阻隔了,每一堆圆当做一个阻碍,问一共有几个阻碍 题解:看起来好 ...

  2. HBase编程 API入门系列之delete(管理端而言)(9)

    大家,若是看过我前期的这篇博客的话,则 HBase编程 API入门之delete(客户端而言) 就知道,在这篇博文里,我是在客户端里删除HBase表的. 这里,我带领大家,学习更高级的,因为,在开发中 ...

  3. Walking on the path of Redis --- Introduction and Installation

    废话开篇 以前从来没听说过有Redis这么个玩意,无意间看到一位仁兄的博客,才对其有所了解,所以决定对其深入了解下.有不对的地方还请各位指正. Redis介绍 下面是官方的介绍,不喜欢english的 ...

  4. Nagios Windows客户端NSClient++ 0.4.x安装配置

    NSClient++ 0.3.x和NSClient++ 0.4.x的配置完全不一样,官方的文档也没有全部更新.我记录下自己的一些操作.   一.下载安装NSClient++ 1.到http://nsc ...

  5. FBX骨骼坐标系与模型坐标系的关系

    采用assimp加载FBX文件.首先记录下ubuntu下assimp的编译安装. cd assimp_unzip_dir mkdir build cd build && cmake . ...

  6. winserver2012安装.net 3.5

    运行 dism.exe /online /enable-feature /featurename:NetFX3 /Source:I:\sources\sxs

  7. trigger事件就是继承某一个类的事件.

    <html><head><script type="text/javascript" src="/jquery/jquery.js" ...

  8. Vue中的v-model与my97日期选择插件冲突

    Vue中的v-model指令只是一个语法糖,其具体实现是:监听input框的input事件,然后将用户输入的值赋值给input框的value属性 <input type="text&q ...

  9. 抢滩5G,哪些行业将受最大影响?

    抢滩5G,哪些行业将受最大影响? 中国工信部6月6日已正式向中国电信.中国移动.中国联通.中国广电发放5G商用牌照.中国成为继韩国.美国.瑞士.英国之后,第五个宣布5G商用的国家. 这次颁发牌照,比计 ...

  10. jmeter录制

    1.添加线程组 2.添加HTTP代理服务 3.浏览器的代理设置 4.添加证书 5.排除模式 .*\.(jpg|css|png|git).*或者 .*\.jpg 6.录制只限制某一个ip段 7.最后一句 ...