Javascript 如何将c数组从c++;
我在“wtypes.h”中找到了一些定义 在我看来,这个定义表明变量可以作为c数组、ptr或c点。 但是,当我使用follow代码将c数组传递给javascript时,无法获取arg的类型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 *
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()