VC与JavaScript交互(二) ———— 调用JS函数
来源:互联网 发布:保利科技 工作 知乎 编辑:程序博客网 时间:2024/04/30 00:28
这一章,我们来动手实践VC调用JS函数。
我们动手写一个HTML,其中包含这样一段JS代码:
然后我们用WebBrowser加载这个HTML后,在VC中这样来调用这个函数名为Add的JS函数:
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函数:
然后在VC中这样写:
可以看到,10,20,30,这三个JS函数返回的值已经躺在我们的varValue[3]里了。
当然,如果不知道JS返回的Array对象里面有几个元素,我们可以在VC这边获取它的length属性,然后在一个循环中取出数组中的每个值。
如果我们的JS函数返回一个包含有多个属性值的Object对象,VC这边该如何接收呢?
让我们再来写一个JS函数:
然后在VC中我们这样接收:
我们从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与JavaScript交互(二) ———— 调用JS函数
- VC与JavaScript交互(二) ———— 调用JS函数
- VC与JavaScript交互(二) ———— 调用JS函数
- VC与JavaScript交互(二) ———— 调用JS函数
- VC与JavaScript交互(二) ———— 调用JS函数
- VC与JavaScript交互(二) --- 调用JS函数
- VC与JavaScript交互(三) ———— CWebPage类调用javascript函数(给js函数传参,并取得返回值)
- VC与JavaScript交互(三) ———— JS调用C++
- VC与JavaScript交互(三) ———— JS调用C++
- VC与JavaScript交互(三) ———— JS调用C++
- VC与JavaScript交互(三) ———— JS调用C++
- VC与JavaScript交互(一) -- 调用JS函数
- VC与JavaScript交互(三) --- CWebPage类调用javascript函数(给js函数传参,并取得返回值)
- VC与JavaScript交互(二)
- Flex与JavaScript交互调用函数
- VC与JavaScript交互(一) ———— 如何实现
- VC与JavaScript交互(一) ———— 如何实现
- VC与JavaScript交互(一) ———— 如何实现
- dp专题
- 华为OJ——判断两个IP是否属于同一子网
- 八数码问题-启发式搜索(A*算法)
- VC与JavaScript交互(一) ———— 如何实现
- 华为OJ——输入一行字符,分别统计出包含英文字母、空格、数字和其它字符的个数
- VC与JavaScript交互(二) ———— 调用JS函数
- java中将double保留一定位数小数输出的方法
- static成员变量,non-static成员变量,局部变量,作用域和生存周期
- 计算机原理(三)
- 华为OJ——称砝码
- C、C++中union用法总结
- Android studio启动时总是在找AndroidSDK的解决办法
- Android Studio入门
- 选择器的优先级