com自动化控件与JavaScript脚本交互数组方法

来源:互联网 发布:大数据专业导论论文 编辑:程序博客网 时间:2024/06/04 18:15

 这里只提供一种com自动化控件和JavaScript相互交互、传递数组数据的参考方法,可能它的实现并不是最好的,呵呵!有其他更多种方法,在这里就不探讨了,偶也暂时不愿意去想,特别是在好不容易弄清现在实现的内部机制,要生态保护下脑细胞了 :)
 
  不过,从这次知识获得的过程来说,个人还是从这种解决方法中了解了很多关于脚本引擎与控件之间打交道的内部机制知识。

#预备知识
1. com自动化控件与脚本间传递的数据只能是VARIANT类型的
2. VARIANT类型的数据相当的基本和原始,复杂数据的传入需要应用协议
3. JavaScript向com自动化控件传递脚本对象,从研究工作代码和个人猜测来看,可能体现为一个IDispatch自动化com对象的传入

#JavaScript向com自动化控件传递数组数据
   在JavaScript中数组对象为Array,我们向Array塞入一些数据后,做好数据准备,就可以调用控件方法了,将数据作为参数传递进去。由前面的预备知识我们知道,Array的传入体现为一个IDispatch自动化com对象,而其实这里自动化对象在VARIANT类型体现为一个IDispatch **ppdispVal,也是VARIANT类型数据。JavaScript封装Array的这个自动化对象提供了Array对象本身支持的pop,push等方法,有了这些方法,在控件代码中我们就可以遍历数组了。由于JavaScrip向Array中塞入的原始简单数据,在脚本引擎封装的Array映射com自动化对象中均会被作为VARIANT类型传递。在这里,特殊一点,也是非常值得指出的是,用户自定义的JavaScript脚本对象也会被JavaScript脚本引擎wrapper成com自动化对象。对于原始简单数据来讲,在控件中直接可以获取,但是对于IDispatch等复杂点的数据,就必须有良好的接口协议。这样,控件才能知晓如果数组里面带有IDispatch自动化对象,应该按照什么“协议”去解析它,确定getX和setX中的X

#com自动化控件向JavaScript传递数组数据
   在这里我举出的com自动化控件向JavaScript传递数组数据实现方法,体现为VARIANT类型SafeArray的传出。由于JavaScript不支持对于VARIANT类型SafeArray的处理,但是,在另外一种脚本技术中,微软自身的VBScript语言支持对VARIANT类型SafeArray的处理。微软也经常做肥水不流外人田,呵呵,总之自己对自己总不能太苛刻,这样就没有办法活了!所以,在这危难的时刻,VBScript就可以灿烂一下了!JavaScript如何才能获得这个数组数据呢?这时,我们就需要在JavaScript就和VBScript之间玩了一个跨脚本语言的数据交互。我们可以猜测,脚本引擎之间也是自动化数据与自动化数据的交互。或根据一个大侠所说,JavaScript和VBScript只是外表表现有差异,但是在内部脚本引擎执行时都是一份代码,是无差别,不过即使如此,也可能改变不了在脚本语言边界传递数据只能是自动化数据的事实。
  我们在JavaScript函数中调用VBScript函数,利用VBScript中提供的对VARIANT类型SafeArray的操作方法,遍历整个SafeArray数据内容!我们知道其实SafeArray中存储也是一些VARIANT类型数据,在遍历过程中,调用JavaScript脚本引擎封装纯脚本对象Array的IDispatch自动化对象中的push方法,个人猜测Array映射自动化com对象提供的push方法的入参应该也是VARIANT类型,这样就可以很顺利的把SafeArray里面的数据导入到JavaScript纯脚本对象Array中,而JavaScript在这个过程中就可以根据put操作转化成自己的语言类型!!
  
  惊天的大逆转就出现在这里,非常、非常的神奇!当你知道一项技术全部知识的时间,特别是由不懂到懂得的飞跃,就很容易在内心很神圣地佩服技术的鬼斧神工,由此俺也写了这篇博客 :) 我喜欢我所爱!

   注:VBScript和JavaScript之间相互操作,来自于自动化机制。
原创粉丝点击