Javascript 如何将c数组从c++;

Javascript 如何将c数组从c++;,javascript,visual-c++,com,external,idispatch,Javascript,Visual C++,Com,External,Idispatch,我在“wtypes.h”中找到了一些定义 在我看来,这个定义表明变量可以作为c数组、ptr或c点。 但是,当我使用follow代码将c数组传递给javascript时,无法获取arg的类型 STDMETHODIMP CFileSystemObject::Invoke( DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *

我在“wtypes.h”中找到了一些定义

在我看来,这个定义表明变量可以作为c数组、ptr或c点。 但是,当我使用follow代码将c数组传递给javascript时,无法获取arg的类型

STDMETHODIMP CFileSystemObject::Invoke( DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr ){
    pVarResult->vt = VT_CARRAY|VT_I4;
    pVarResult->pintVal = new int[4];
}
如何将C数组传递给C++的JavaScript?
VT|u CARRAY>VT|u I4

由于明显的原因,没有机会计算出来:值28和3不是偶数或可数。结果值31只不过是
VT_LPWSTR
。。。将其与驻留在单独位位置的VT_阵列进行比较,以避免干扰基本类型


VT_CARRAY
本身就是一种变体类型,我甚至不希望它在JS端得到支持。使用安全阵列将数据传送到JS,这是一个可靠的替代选项。

有几种方法可以实现接近目标的目标

A)让您的方法返回一个
SAFEARRAY
(请参见
SafeArrayCreate
SafeArrayAccessData
等)。然后,您可以将其打包到类型为
VT_ARRAY | VT_I4
的变体中。JavaScript不能直接使用safearrays,但可以借助
VBArray
object。在JavaScript方面,调用看起来如下所示:

  var retArr = new VBArray(yourObject.yourMethod()).toArray()
请注意,如果希望除了JavaScript之外还可以从VBScript调用方法,VBScript只理解变体的安全数组(
VT_数组| VT_变体
),而不理解任何其他类型。因此,您需要创建一个安全的变体数组,并让每个变体包装一个int。JavaScript也可以使用这种安排

B)实现一个单独的COM集合对象来包装数组。该对象将公开,例如,
length
item()
属性,以访问单个元素;以及可选的
\u NewEnum
属性,以便在每个语法中很好地使用VBScript的
,如果这是一个问题的话。然后,您的方法将创建并返回该对象的实例

我认为,尽管不是100%确定,除了常规的
objectName.item(I)
语法之外,JavaScript中还可以通过
objectName[I]
语法访问默认属性(具有
DISPID
DISPID\u值的属性)。如果这样做有效,则会使集合对象看起来几乎像一个本机JavaScript数组

C)创建、填充并返回本机JavaScript数组对象:


我个人不建议这样做,因为它将您的组件与特定主机紧密地联系在一起。我提到它是为了完整。

可能重复@suspectus,我想我的问题与您的链接有些不同。您发现了什么不同?我的问题的关键是如何使用此定义将c数组传递给javascript,我认为此定义可以帮助我们做到这一点,但我找不到如何使用它。
  var retArr = new VBArray(yourObject.yourMethod()).toArray()