2

i found some definition in "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

In my opinion,this definition show that a Variant can as a c array,ptr or c point. but can't get the type of arg when i use follow code to pass c array to 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];
}

how to pass c array to javascript from c++?

4
  • Possible duplicate of stackoverflow.com/questions/12005610/javascript-c-binding Commented Jul 15, 2013 at 7:00
  • @suspectus ,i think my question has some difference from your link. Commented Jul 15, 2013 at 7:14
  • what difference do you find? Commented Jul 15, 2013 at 7:15
  • my question's key point is how to use this definition to pass c array to javascript,i think this definition can help us to do it,but i can't find how to use it. Commented Jul 15, 2013 at 7:29

2 Answers 2

2

There are several ways you can achieve something close to your goal.

A) Have your method return a SAFEARRAY (see SafeArrayCreate, SafeArrayAccessData et al). You can then pack that into a variant of type VT_ARRAY | VT_I4. JavaScript cannot consume safearrays directly, but can with the help of VBArray object. On JavaScript side, the call would look something like this:

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

Note that, if you want your method to be callable from VBScript in addition to JavaScript, VBScript only understands safearrays of variants (VT_ARRAY | VT_VARIANT), not of any other type. So you would need to create a safearray of variants, and have each of those variants wrap an int. JavaScript would work with such an arrangement, too.

B) Implement a separate COM collection object wrapping the array. That object would expose, say, length and item() properties for access to individual elements; and optionally _NewEnum property to play well with VBScript's for each syntax, if that's a concern. Your method would then create and return an instance of that object.

I think, though am not 100% sure, that a default property (one with DISPID of DISPID_VALUE) is accessible in JavaScript via objectName[i] syntax, in addition to the regular objectName.item(i) syntax. If that works, that would make the collection object look almost like a native JavaScript array.

C) Create, populate and return a native JavaScript Array object:

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

I wouldn't personally recommend this, as it ties your component intimately to a particular host. I mention it for completeness.

Sign up to request clarification or add additional context in comments.

Comments

1

VT_CARRAY | VT_I4

Has no chances to work out for obvious reason: the values 28 and 3 are not even OR'rable. The resulting value of 31 is nothing but VT_LPWSTR... Compare this to VT_ARRAY 0x2000 residing in separate bit position to not interfere with base type.

VT_CARRAY is a variant type on its own and I would not even expect it to be supported on JS side. Use safe arrays to have your data delivered to JS, this is a reliable alternate option.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.