gpt4 book ai didi

javascript - 如何将 c 数组从 C++ 传递给 javascript

转载 作者:行者123 更新时间:2023-11-30 12:59:47 24 4
gpt4 key购买 nike

我在“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可以作为一个c数组,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?

最佳答案

您可以通过多种方式实现接近目标的目标。

A) 让您的方法返回一个SAFEARRAY(参见SafeArrayCreateSafeArrayAccessData 等)。然后,您可以将其打包成 VT_ARRAY | 类型的变体。 VT_I4。 JavaScript 不能直接使用 safearrays,但可以借助 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% 确定,默认属性(DISPIDDISPID_VALUE)可以通过 objectName[i] 在 JavaScript 中访问 语法,除了常规的 objectName.item(i) 语法。如果可行,那将使集合对象看起来几乎像原生 JavaScript 数组。

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

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

我个人不推荐这样做,因为它将您的组件与特定主机密切相关。我提到它是为了完整性。

关于javascript - 如何将 c 数组从 C++ 传递给 javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17648367/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com