全部博文(788)
分类:
2008-11-27 21:16:49
Delphi的函数返回值好像不支持数组。
我也为这个问题困惑了很久,实际上,javascript中的数组并非safeArray,不是delphi数组转换成varArray的兼容类型,它是一个支持双接口的Com对象,我找了很久,没找到这个对象的类型库,我觉得可以写一个支持双接口的类,包含javascript数组的公共方法就可以了。但是,又有问题,我不知道在javascript中如何转换索引器(比如fg[2])的,这个找了很久也找不到说明。
郁闷的不行,最后,只好在调用函数中多包含一个参数,这个参数类型就是IDispatch接口,然后在javascript中传入new Array()。再用IDispatch的invoke调用这个数组对象的方法来添加值。
我都快疯了。
我实在要疯了,真不知道javascript对象的类型库在哪里。找遍MSDN找不到。
再后来,我也不需要使用者传递数组。
我可以从ActiveX获取Browsor,进而获取Document,然后让Document执行一个脚本,他有一个方法InvokeScript,我就调用这个方法,用eval执行了new Array()。得到返回的JS数组对象。
后来,只要是JS需要的对象,除了基本的值类型以外,我都用这个办法来创造兼容的JS对象。
我还给我的ActiveX对象添加了attachEvent和detachEvent方法,这样,javascript可以用习惯办法来响应ActiveX事件,而不是用event类型的script代码段来做。我在内部用了一个列表,支持多播。
后来我的ActiveX对象搞得和标准的内置的JS对象差不多了,呵呵,当然都没用标准的办法,实际上是得益于IDispatch的灵活。他的后期绑定和按照名称绑定的策略的确不错。
实际上IDispatch并没拒绝重载,只是delphi这种编译型的语言,运行期类型信息很不完整,不会包含函数参数列表的,所以,在后期绑定的时候无法实现重载。