比如在COM里面创建一个数组, 比如JavaScript里面是这样定义一个数组, var obj1 = new Array(1, "abcd", new Date());我想在ATL里面创建这个数组. 假设COM的接口函数 HRESULT GetArray[out,retval] VARIANT *vtRet);在JavaScript里面调用 var obj2 = GetArray();使的obj2和obj1是等效的.有没有办法实现?

解决方案 »

  1.   

    有的, 微软提供了一个例子,
    其实就是 IDispatchEx 接口的威力,
    使得你可以用 c++ 编写任何等效的 js 代码.不过就是代码量大些罢了.你去微软下载 wscript56.chm 看看,
    接口 IDispatchEx 中有示例代码.
      

  2.   

    留上正解 ,实际上 java script 的 数组在微软体系中 ,不等效于 safearray ,而是等效于 IDispatchEx,我做过一个组件 ,可以直接通jscript 交互,传入传出 数组,用IDispatchEx 实现的 。《脚本驱动的应用软件开发方法与实践》 书中有一些实现供参考,值得注意的是 作者是从最底层接口的实现开始写起的 ,现在ATL 进化了,好多实现可以直接用ATL 的模板,方便了很多。
      

  3.   

    谢谢楼上两位,这段时间忙,还没继续研究.我原来的方法是, JavaScript先创建好数组, 把这个数组传给COM函数, COM函数内部修改数组参数. 
      

  4.   

    基于 IDispatchEx 的组件。
      

  5.   

    其实直接使用 SafeArray,然后再 JS 里表现为 VBArray。
    使用 toArray 就是 JS 的 Array 了。