Comment retourner correctement un tableau de chaînes d’un objet ActiveX vers JScript

Si vous travaillez avec une API Win32 et devez retourner un tableau de chaînes d’un objet ActiveX vers JScript, vous pourriez rencontrer quelques défis. Ce problème survient généralement lorsque les chaînes semblent être ‘perdues’ durant le transfert. Comprendre la relation entre les objets COM, ActiveX et JScript est crucial pour une gestion réussie des données dans ces environnements. Dans cet article, nous allons passer en revue l’approche correcte pour y parvenir.

Le Problème

Vous avez défini une interface dans votre fichier IDL (Interface Definition Language) pour un objet COM qui inclut une méthode renvoyant un tableau de chaînes. Plus précisément, la signature de la fonction apparaît comme suit :

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

Bien que la fonction elle-même fonctionne correctement, le problème réside dans le fait que les chaînes sont assignées à une variable en JavaScript, entraînant la perte apparente des chaînes. Nous devons nous assurer que les données sont transférées correctement.

La Solution

Pour passer correctement le tableau de chaînes de votre objet ActiveX vers JScript, suivez ces étapes détaillées :

Étape 1 : Enveloppez le SAFEARRAY dans un VARIANT

Pour faciliter la communication entre l’objet COM et JScript, vous devez envelopper le SAFEARRAY dans un VARIANT avant de le renvoyer. Cela permet de gérer correctement le tableau et de garantir qu’aucune perte de données n’intervienne. Voici le code de fonction modifié pour y parvenir :

HRESULT GetArrayOfStrings(/*[out, retval]*/ VARIANT* pvarBstrStringArray)
{
   // Déclarez un variant pour contenir le tableau.
   _variant_t ret;
   // Définissez le type de variant comme un tableau de variants.
   ret.vt = VT_ARRAY | VT_VARIANT;
   ret.parray = rgBstrStringArray; // Assignez le SAFEARRAY.
   *pvarBstrStringArray = ret.Detach(); // Détachez-le pour le retour.
   return S_OK; // Renvoie le succès.
}

Étape 2 : Utilisez VBArray dans JScript

Une fois les données enveloppées dans un VARIANT et renvoyées avec succès depuis ActiveX, vous pouvez utiliser l’objet VBArray dans votre code JScript pour déballer correctement les données. La ligne de code dont vous aurez besoin est :

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

Cette ligne de code convertit efficacement le VARIANT renvoyé en un tableau de chaînes compatible avec JavaScript, vous permettant de gérer les données comme souhaité.

Conclusion

Gérer le transfert d’un tableau de chaînes d’un objet ActiveX vers JScript revient à comprendre comment manipuler des objets COM et les interactions JavaScript. En enveloppant votre SAFEARRAY dans un VARIANT et en utilisant le VBArray pour le déballer, vous pouvez vous assurer que toutes les données sont correctement transmises sans perte.

Vous devriez maintenant être équipé de la bonne approche pour retourner et utiliser avec succès des tableaux de chaînes dans vos scripts administratifs. Bon codage !