vc 通过vc webbrowser控件件打开本地的网页,获取js函数,执行js的时候提示缺少十六进制数

在对话框的webbrowser控件中调用源码的onclick
[问题点数:100分,结帖人lianghaomingg]
在对话框的webbrowser控件中调用源码的onclick
[问题点数:100分,结帖人lianghaomingg]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关帖子推荐:
2009年7月 VC/MFC大版内专家分月排行榜第三
2009年7月 VC/MFC大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。webbrowser控件执行js脚本源码 - 下载频道 - CSDN.NET
webbrowser控件执行js脚本源码
webbrowser控件执行js脚本源码
找了好久才找到的,不容易啊。呵呵
找了好久才找到的,不容易啊。呵呵
找了好久才找到的,不容易啊。呵呵
找了好久才找到的,不容易啊。呵呵
找了好久才找到的,不容易啊。呵呵
若举报审核通过,可奖励20下载分
被举报人:
winnerforever_1
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
您可能还需要
Q.为什么我点的下载下不了,但积分却被扣了
A. 由于下载人数众多,下载服务器做了并发的限制。若发现下载不了,请稍后再试,多次下载是不会重复扣分的。
Q.我的积分不多了,如何获取积分?
A. 获得积分,详细见。
完成任务获取积分。
评价资源返积分。
论坛可用分兑换下载积分。
第一次绑定手机,将获得5个C币,C币可。
下载资源意味着您已经同意遵守以下协议
资源的所有权益归上传用户所有
未经权益所有人同意,不得将资源中的内容挪作商业或盈利用途
CSDN下载频道仅提供交流平台,并不能对任何下载资源负责
下载资源中如有侵权或不适当内容,
本站不保证本站提供的资源的准确性,安全性和完整性,同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
开发技术下载排行
你下载资源过于频繁,请输入验证码
如何快速获得积分?
你已经下载过该资源,再次下载不需要扣除积分
webbrowser控件执行js脚本源码
所需积分:10
剩余积分:
VIP会员,免积分下载
会员到期时间:日
剩余下载次数:1000
VIP服务公告:这一章,我们来动手实践VC调用 JS函数 。
我们动手写一个HTML,其中包含这样一段JS代码:
[html] view plain copy
%20%20%20%20&%20script%20&%20type%20=%20&text/javascript&%20&%20&&%20%20%20&&&&function&Add(value1,&value2)&{&&%20%20&&&&&&&&return&value1&+&value2;&&%20%20&&&&}&&%20%20%20&/%20script%20&%20&&%20%20%20然后我们用WebBrowser加载这个HTML后,在VC中这样来调用这个函数名为Add的JS函数:%20%20[cpp]%20view%20plain%20copy%20 %20%20%20%20//别忘了#include&&MsHTML.h&%20&&%20%20%20%20//m_WebBrowser是一个WebBrowser的Activex控件对象。%20&&%20%20%20CComQIPtr&IHTMLDocument2&&spDoc&=&m_WebBrowser.get_Document();&&%20%20CComDispatchDriver&spS&&%20%20spDoc-&get_Script(&spScript);&&%20%20&&%20%20CComVariant&var1&=&10,&var2&=&20,&varR&&%20%20%20spScript.Invoke2(L%20&Add&%20,&&var1,&&var2,&&varRet);&&%20%20%20%20
spScript.Invoke2的作用是调用JS函数中名为Add的函数,传入两个参数,用varRet接收返回值。
可以看到,Invoke2调用成功后,varRet得到了返回值30。
但这样的话一次只能接受一个返回值。
如果要一次接受多个返回值的话,怎么办呢?
我们可以让JS返回一个JS中的Array数组或Object对象。
当JS函数return一个Array或一个Object对象时,VC这边的varRet将接受到一个代表该对象的 IDispatch 接口。我们仍然用CComDispatchDriver来管理这个IDispatch。用上 一篇文章 介绍的CComDispatchDriver的四个方法:
GetProperty
GetPropertyByName
PutProperty
PutPropertyByName
来从这个Array或Object对象中取出我们要的数据。
实践是检验真理的唯一标准,让我们再来写一个JS函数:
[html] view plain copy
%20%20%20%20&%20script%20&%20type%20=%20&text/javascript&%20&%20&&%20%20%20&&&&function&Add(value1,&value2)&{&&%20%20%20&&&&&&&&var&%20array%20&=&%20new%20&Array();&&%20%20%20&&&&&&&&array[0]&=&value1;&&%20%20&&&&&&&&array[1]&=&value2;&&%20%20&&&&&&&&array[2]&=&value1&+&value2;&&%20%20&&&&&&&&return&&&%20%20&&&&}&&%20%20%20&/%20script%20&%20&&%20%20%20然后在VC中这样写:%20%20[cpp]%20view%20plain%20copy%20 %20%20%20%20CComQIPtr&IHTMLDocument2&&spDoc&=&m_WebBrowser.get_Document();&&%20%20%20CComDispatchDriver&spS&&%20%20spDoc-&get_Script(&spScript);&&%20%20&&%20%20CComVariant&var1&=&10,&var2&=&20,&varR&&%20%20%20spScript.Invoke2(L%20&Add&%20,&&var1,&&var2,&&varRet);&&%20%20%20&&&&&&%20%20CComDispatchDriver&spArray&=&varRet.pdispV&&%20%20%20&&%20%20%20CComVariant&varArrayL&&%20%20%20spArray.GetPropertyByName(L%20&length&%20,&&varArrayLen);&&%20%20%20%20//获取数组中第0,1,2个元素的值:%20&&%20%20%20CComVariant&varValue[3];&&%20%20%20spArray.GetPropertyByName(L%20&0&%20,&&varValue[0]);&&%20%20%20%20spArray.GetPropertyByName(L%20&1&%20,&&varValue[1]);&&%20%20%20%20spArray.GetPropertyByName(L%20&2&%20,&&varValue[2]);&&%20%20%20%20
可以看到,10,20,30,这三个JS函数返回的值已经躺在我们的varValue[3]里了。
当然,如果不知道JS返回的Array对象里面有几个元素,我们可以在VC这边获取它的length属性,然后在一个循环中取出数组中的每个值。
如果我们的JS函数返回一个包含有多个属性值的Object对象,VC这边该如何接收呢?
让我们再来写一个JS函数:
[html] view plain copy
%20%20%20%20&%20script%20&%20type%20=%20&text/javascript&%20&%20&&%20%20%20&&&&function&Add(value1,&value2)&{&&%20%20%20&&&&&&&&var&%20data%20&=&%20new%20&Object();&&%20%20%20%20&&&&&&&&%20data.result%20&=&%20value1%20&+&value2;&&%20%20%20%20&&&&&&&&%20data.str%20&=&%20&Hello,我是小明!&%20;&&%20%20%20&&&&&&&&return&&&%20%20&&&&}&&%20%20%20&/%20script%20&%20&&%20%20%20然后在VC中我们这样接收:%20%20[cpp]%20view%20plain%20copy%20 %20%20%20%20CComQIPtr&IHTMLDocument2&&spDoc&=&m_WebBrowser.get_Document();&&%20%20%20&&&&CComDispatchDriver&spS&&%20%20&&&&spDoc-&get_Script(&spScript);&&%20%20&&%20%20&&&&CComVariant&var1&=&10,&var2&=&20,&varR&&%20%20%20&&&&spScript.Invoke2(L%20&Add&%20,&&var1,&&var2,&&varRet);&&%20%20%20&&&&&&%20%20&&&&CComDispatchDriver&spData&=&varRet.pdispV&&%20%20&&&&CComVariant&varValue1,&varValue2;&&%20%20%20&&&&spData.GetPropertyByName(L%20&result&%20,&&varValue1);&&%20%20%20%20&&&&spData.GetPropertyByName(L%20&str&%20,&&varValue2);&&%20%20%20%20
我们从JS返回的Object对象里取出了它的两个属性,result和str,分别是一个整形数据和一个字符串。
这里JS代码是我们自己写的,在VC这边当然事先知道这个JS函数返回的对象有result和str这两个属性。
如果JS代码不是我们写的,或者它的属性是事先不能确定的,该怎么办呢?答案是使用 IDispatchEx接口来枚举 这个对象的相关信息(方法名、属性名)。
这个现在暂时不讲,在后续的文章中会讲。
当然,JS不只可以返回Object对象,返回什么对象都可以,当返回一个对象而非基本数据类型(整形、浮点、字符串)时,VC这边收到的返回值是一个 IDispatch,然后我们需要调用
GetPropertyByName方法从这个IDispatch代表的对象中取出它的属性来。
这样一来,VC调用JS函数,传递参数给JS和JS返回返回值给VC,大致就都会了。
对于CComVariant包装的VARIANT这种智能型变量,不了解的可以到网上看下相关资料。《 深入解析ATL 》之类的书上均有介绍。
值得注意 的是ATL提供的这些CCom开头的智能包装类,并不依赖于ATL的动态库。因为我在VC项目中并没有选择链接ATL,程序调试运行时进程加载的模块中也有没有ATL100.dll之类的模块载入。大家可以放心使用而不用担心依赖上ATL。
VC调用JS函数没问题了。那么JS函数如何调用VC呢?我们将在下一篇文章中慢慢道来。
无相关信息VC &&&&最新内容
VC &&&&随机内容

我要回帖

更多关于 wpf webbrowser控件 的文章

 

随机推荐