2008-09-05 12 views
5

Je dois appeler une API Win32 pour obtenir une série de chaînes, et je voudrais retourner un tableau de ces chaînes à JavaScript. C'est pour le script qui s'exécute sur la machine locale pour les scripts d'administration, pas pour le navigateur Web.Comment puis-je retourner un tableau de chaînes d'un objet ActiveX à JScript

Mon fichier IDL pour l'objet COM a l'interface que je fais appel en tant que:

 
HRESULT GetArrayOfStrings([out, retval] SAFEARRAY(BSTR) * rgBstrStringArray); 

La fonction retourne correctement, mais les chaînes sont de « perdu » quand ils sont affectés à une variable JavaScript.

La question est: Quelle est la bonne façon d'obtenir le tableau de chaînes renvoyé à une variable JavaScript?

Répondre

6

Si je me souviens bien, vous aurez besoin d'envelopper le SAFEARRAY dans un VARIANT pour que pour passer à travers, puis utilisez un VBArray object pour le décompresser sur le côté JS des choses:

HRESULT GetArrayOfStrings(/*[out, retval]*/ VARIANT* pvarBstrStringArray) 
{ 
    // ... 

    _variant_t ret; 
    ret.vt = VT_ARRAY|VT_VARIANT; 
    ret.parray = rgBstrStringArray; 
    *pvarBstrStringArray = ret.Detach(); 
    return S_OK; 
} 

puis

var jsFriendlyStrings = new VBArray(axOb.GetArrayOfStrings()).toArray(); 
+0

L'instruction de retour ret.Detach() doit-elle être > pvarBstrStringArray = ret.Detach(); Merci – Mark

1

Shog9 est correcte. Les scripts COM nécessitent que toutes les sorties soient VARIANTS.

En fait, il faut aussi que tous les INPUT soient VARIANTES aussi - voir les détails désagréables d'IDispatch dans votre fichier d'aide préféré. C'est seulement la magie de l'implémentation de Dual Interface par ATL et des couches similaires (qui est probablement ce que vous utilisez) que vous n'avez pas à vous inquiéter à ce sujet. Les variables VARIANT d'entrée transmises par le code appelant sont converties pour correspondre à la signature de votre méthode avant l'appel de votre méthode actuelle.