2013-07-15 3 views
1

je trouve une définition dans « wtypes.h »comment passer tableau c à javascript de 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 

À mon avis, ce spectacle de définition qu'une variante peut comme un tableau de c, ptr ou point c. mais ne peut pas obtenir le type de arg quand j'utiliser le code de suivi pour passer ensemble de 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]; 
} 

comment passer tableau c à javascript de C++?

+0

Copie possible de http://stackoverflow.com/questions/12005610/javascript-c-binding – suspectus

+0

@suspectus, je pense que ma question a une certaine différence avec votre lien. – tfzxyinhao

+0

quelle différence trouvez-vous? – suspectus

Répondre

1

VT_CARRAY | VT_I4

A pas de chances de travailler pour des raisons évidentes: les valeurs 28 et 3 ne sont même pas OR'rable. La valeur résultante de 31 n'est rien mais VT_LPWSTR ... Comparez ceci à VT_ARRAY0x2000 résidant dans la position de bit séparée pour ne pas interférer avec le type de base.

VT_CARRAY est un type de variante à part et je ne m'attendrais même pas à ce qu'il soit supporté du côté JS. Utilisez des tableaux sécurisés pour que vos données soient transmises à JS. Il s'agit d'une option alternative fiable.

2

Il existe plusieurs façons d'atteindre un objectif proche de votre objectif.

A) Demandez à votre méthode un retour SAFEARRAY (voir SafeArrayCreate, SafeArrayAccessData et al). Vous pouvez ensuite l'emballer dans une variante de type VT_ARRAY | VT_I4. JavaScript ne peut pas consommer safearrays directement, mais peut avec l'aide de VBArray objet. Côté JavaScript, l'appel ressemblerait à quelque chose comme ceci:

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

Notez que, si vous voulez que votre méthode soit appelable à partir de VBScript en plus de JavaScript, VBScript ne comprend que safearrays des variantes (VT_ARRAY | VT_VARIANT), et non de tout autre type. Donc, vous devrez créer un safearray de variantes, et avoir chacune de ces variantes envelopper un int. JavaScript fonctionnerait avec un tel arrangement, aussi.

B) Implémenter un objet de collecte COM séparé envelopper le tableau. Cet objet exposerait, par exemple, les propriétés length et item() pour l'accès à des éléments individuels; et éventuellement la propriété _NewEnum pour bien jouer avec la syntaxe for each de VBScript, si c'est un problème. Votre méthode créerait et retournerait une instance de cet objet.

Je pense, bien que ne suis pas sûr à 100%, qu'une propriété par défaut (une avec DISPID de DISPID_VALUE) est accessible en JavaScript via objectName[i] syntaxe, en plus de la syntaxe objectName.item(i) régulière. Si cela fonctionne, cela ferait ressembler l'objet de collection presque comme un tableau JavaScript natif.

C) Créer, remplir et retourner un JavaScript natif objet Array:

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

Je ne recommanderais pas personnellement cela, car il lie intimement à votre composant un hôte particulier. Je le mentionne pour l'exhaustivité.

Questions connexes