2013-07-15 35 views
1

传递的JavaScript我发现在“wtypes.h”一些定义如何到c阵列从C++

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 

在我看来,这个定义表明,一个变体可为C阵列,PTR或c点。 但是当我使用如下代码到C数组传递给JavaScript

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不能获得arg的类型++?

+0

可能的重复http://stackoverflow.com/questions/12005610/javascript-c-binding – suspectus

+0

@suspectus,我想我的问题有一些不同,从你的链接。 – tfzxyinhao

+0

你有什么不同? – suspectus

回答

1

VT_CARRAY | VT_I4

已经没有机会制定出明显的原因:值28和3甚至不OR'rable。结果31的值不过是VT_LPWSTR ...将其与VT_ARRAY0x2000进行比较,该值位于不同的位位置,以不干扰基本类型。

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

2

有几种方法可以达到您的目标。

一个)有你的方法返回一个SAFEARRAY(见SafeArrayCreateSafeArrayAccessData等)。然后,您可以将其打包成VT_ARRAY | VT_I4类型的变体。 JavaScript不能直接使用safearrays,但可以借助VBArray对象。在JavaScript端,呼叫会是这个样子:

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

需要注意的是,如果你想你的方法可以被调用从VBScript除了JavaScript中,VBScript中既懂变种SAFEARRAYS(VT_ARRAY | VT_VARIANT),不是任何其他类型。所以你需要创建一个变体safearray,并让每个变体包装一个int。 JavaScript也可以与这样的安排一起工作。

B)实现包装数组的单独COM集合对象。该对象将暴露,例如,lengthitem()属性访问个别元素;并可选择使用VBScript的for each语法,如果这是一个问题,可以使用_NewEnum属性。然后,您的方法将创建并返回该对象的一个​​实例。

我想,虽然我不是100%确定,即默认属性(即一个DISPID_VALUEDISPID)通过objectName[i]语法在JavaScript访问,除了常规的objectName.item(i)语法。如果这样做,那会使集合对象看起来像一个本地JavaScript数组。

Ç)创建,填充并返回本地JavaScript Array对象:

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

我不会亲自推荐这个,因为它紧密联系在一起的组件到一个特定的主机。我提到它的完整性。