Comment puis-je retourner un tableau de chaînes à partir d'un objet ActiveX pour JScript

StackOverflow https://stackoverflow.com/questions/45169

  •  09-06-2019
  •  | 
  •  

Question

J'ai besoin d'appeler une API Win32 pour obtenir une série de cordes, et je voudrais retourner un tableau de chaînes de JavaScript.C'est pour un script qui s'exécute sur l'ordinateur local pour les scripts d'administration, pas pour le navigateur web.

Mon fichier IDL de l'objet COM a l'interface que je suis à l'appel que:

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

La fonction renvoie correctement, mais les cordes se sont "perdues" lorsqu'ils sont affectés à une variable en JavaScript.

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

Était-ce utile?

La solution

Si je me souviens correctement, vous aurez besoin de mettre la SAFEARRAY dans un VARIANT pour passer à travers, et ensuite utiliser un VBArray objet la décompresser sur le JS côté 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;
}

alors

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

Autres conseils

Shog9 est correcte.COM script exige que toutes les sorties des VARIANTES.

En fait, il exige également que tous les Entrées être aussi bien des VARIANTES -- voir les détails désagréables de IDispatch dans vos favoris fichier d'aide.C'est la seule pensée de la magie de la Double Interface de mise en œuvre par ATL et calques similaires (ce qui est probablement ce que vous utilisez), que vous n'avez pas à vous soucier de cela.L'entrée Variantes adoptées par le code appelant sont convertis pour correspondre à votre signature de la méthode que votre méthode est appelée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top