2

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

VT_PTR  = 26,
VT_SAFEARRAY    = 27,
VT_CARRAY   = 28,
VT_USERDEFINED  = 29,
VT_LPSTR    = 30,
VT_LPWSTR   = 31,


*  VT_PTR                 [T]        pointer type
*  VT_SAFEARRAY           [T]        (use VT_ARRAY in VARIANT)
*  VT_CARRAY              [T]        C style array
*  VT_USERDEFINED         [T]        user defined type
*  VT_LPSTR               [T][P]     null terminated string
*  VT_LPWSTR              [T][P]     wide null terminated string

在我看来,这个定义表明 Variant 可以作为 ac 数组、ptr 或 c 点。但是当我使用跟随代码将 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?

4

2 回答 2

2

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

A ) 让您的方法返回 a SAFEARRAY(参见SafeArrayCreate, SafeArrayAccessDataet al)。然后,您可以将其打包到 type 的变体中VT_ARRAY | VT_I4。JavaScript 不能直接使用安全数组,但可以借助VBArray对象。在 JavaScript 方面,调用看起来像这样:

  var retArr = new VBArray(yourObject.yourMethod()).toArray()

请注意,如果您希望除了 JavaScript 之外还可以从 VBScript 调用您的方法,则 VBScript 只理解变体 ( VT_ARRAY | VT_VARIANT) 的安全数组,而不是任何其他类型的。因此,您需要创建一个安全的变体数组,并让每个变体都包装一个 int。JavaScript 也可以在这样的安排下工作。

B ) 实现一个单独的 COM 集合对象来包装数组。该对象将公开访问单个元素的属性lengthitem()和可选_NewEnum的属性以与 VBScript 的for each语法很好地配合,如果这是一个问题。然后,您的方法将创建并返回该对象的实例。

我认为,尽管不是 100% 肯定,除了常规语法之外,还可以通过语法在 JavaScript 中访问默认属性(带有DISPIDof 的属性) 。如果这样可行,那将使集合对象看起来几乎像原生 JavaScript 数组。DISPID_VALUEobjectName[i]objectName.item(i)

C ) 创建、填充并返回一个原生 JavaScript Array 对象:

http://www.codeproject.com/Articles/88753/Creating-JavaScript-arrays-and-other-objects-from

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

于 2013-07-15T13:58:48.120 回答
1

VT_CARRAY | VT_I4

由于明显的原因没有机会解决:值 28 和 3 甚至不是 OR'rable。结果值 31 只不过是VT_LPWSTR……将其与VT_ARRAY 0x2000驻留在单独的位位置进行比较,以免干扰基本类型。

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

于 2013-07-15T09:58:03.987 回答