PRB : Script une erreur se produit lorsque référencement variante Non Array

Traductions disponibles Traductions disponibles
Numéro d'article: 165967 - Voir les produits auxquels s'applique cet article
Cet article a été archivé. Il est proposé « en l'état » et ne sera plus mis à jour.
Agrandir tout | Réduire tout

Symptômes

Lorsque un script tente de référencer les éléments d'un tableau retourné par un composant, le moteur de script signale :
«Objet ne gère pas cette propriété ou la méthode ' <object>. <method>' "

Cause

Le moteur de script actif VBSCRIPT fourni par Microsoft ne prend en charge que l'indexation de SAFEARRAYs de VARIANTs. Lorsque VBSCRIPT est capable d'accepter des tableaux de type variant non aux fins de vérification de limite et passer à autre automatisation des objets, le moteur ne permettre pas de manipuler le contenu du tableau pour l'instant.

Le moteur de script actif JSCRIPT ne prend pas en charge pour tester les limites ou l'indexation de ces tableaux de n'importe quel type, y compris les variantes. Toutefois, JSCRIPT est capable de transférer ces tableaux d'un objet automation à l'autre.

Résolution

Pour fonctionner correctement avec les applications et composants ce ordinateur hôte VBSCRIPT, automation (objets) doivent créer SAFEARRAYs de VARIANTs. Données de type VARIANT non doivent être empaquetées dans les éléments de type VARIANT du SAFEARRAY à retourner au moteur VBSCRIPT.

Scripts écrits en VBSCRIPT doivent utiliser la fonction TypeName pour vérifier le type de données d'une variable. La fonction TypeName renvoie la chaîne «Variant()», à l'exclusion des devis, lorsqu'il est passé d'un tableau de Variant.

Scripts écrits en JSCRIPT doivent utiliser l'opérateur typeof pour tester le type de données d'une variable. L'opérateur typeof retourne la chaîne «inconnu», à l'exclusion des devis pour des types de données non pris en charge par JSCRIPT.

Statut

Ce comportement est voulu par la conception même du produit.

Plus d'informations

Le VBSARRAY est un simple ATL (Active Template Library) version 2.1 composant objet qui illustre ce comportement. Le composant implémente une interface double Ivbsa prend en charge trois méthodes : TestBstrs, TestVariants et TestPassArray. Le premier illustre le problème en retournant un SAFEARRAY de BSTR. Le second montre la solution par chacun des BSTR dans un VARIANT de packaging. La troisième montre qu'un tableau de type VARIANT non peut être passé à partir de composant VBSCRIPT ou JSCRIPT au composant. Les données restent intactes.

Voici l'implémentation de TestVariants :
      // Return a VARIANT array of VARIANTs which hold BSTRs
      STDMETHODIMP Cvbsa::TestVariants(VARIANT * pvaVariant)
      {
         HRESULT hr = NOERROR;
         LPSAFEARRAY psa;
         SAFEARRAYBOUND rgsabound[]  = { 3, 0 }; // 3 elements, 0-based
         int i;

         if (!pvaVariant)
         {
            return E_INVALIDARG;
         }

         VariantInit(pvaVariant);

         psa = SafeArrayCreate(VT_VARIANT, 1, rgsabound);
         if (!psa)
         {
            return E_OUTOFMEMORY;
         }

         VARIANT vFlavors[3];
         for (i = 0; i < 3; i++)
         {
            VariantInit(&vFlavors[i]);
            V_VT(&vFlavors[i]) = VT_BSTR;
         }

         V_BSTR(&vFlavors[0]) = SysAllocString(OLESTR("Vanilla"));
         V_BSTR(&vFlavors[1]) = SysAllocString(OLESTR("Chocolate"));
         V_BSTR(&vFlavors[2]) = SysAllocString(OLESTR("Espresso Chip"));
         if (!V_BSTR(&vFlavors[0]) || !V_BSTR(&vFlavors[1]) ||
             !V_BSTR(&vFlavors[2]))
         {
            hr = E_OUTOFMEMORY;
            goto Error;
         }

         {
                //Plug references to the data into the SAFEARRAY
               LPVARIANT rgElems;
               if (FAILED(hr = SafeArrayAccessData(psa,(LPVOID*)&rgElems)))

            {
               goto Error;
            }
            for (i = 0; i < 3; i++)
            {
               rgElems[i] = vFlavors[i];
            }
            SafeArrayUnaccessData(psa);
         }

         V_VT(pvaVariant) = VT_ARRAY | VT_VARIANT;
         V_ARRAY(pvaVariant) = psa;

         return NOERROR;

   Error:
         for (i = 0; i < 3; i++)
         {
            if (V_BSTR(&vFlavors[i])
            {
               VariantClear(&vFlavors[i]);
            }
         }
         return hr;
   }
				
ici est le code JSCRIPT à partir de VBSARRAY.HTM, la page de test incluse dans l'exemple qui vérifie le type de données d'une variable :
      <SCRIPT LANGUAGE=JSCRIPT>
      function JScriptSafeArrayTest()
      {
         pvaBstr = SimpleComponent.TestBstrs()
         if (typeof(pvaBstr) == "unknown")
         {
            Alert("JSCRIPT cannot handle the type returned by TestBstrs()")
            SimpleComponent.TestPassedArray(pvaBstr)
         }

         pvaVariant = SimpleComponent.TestVariants()
         if (typeof(pvaVariant) == "unknown")
         {
         Alert("JSCRIPT cannot handle the type returned by TestVariants()")
            SimpleComponent.TestPassedArray(pvaVariant)
         }
      }
      </SCRIPT>
				
Pour illustrer le problème et de la solution, procédez comme suit :

  1. Suivez les instructions ci-dessous sur l'obtention de l'exemple de composant VBSARRAY.DLL et exemple de page VBSARRAY.HTM.
  2. Enregistrer le composant VBSARRAY.DLL à l'aide d'un outil tel que Regsvr32.exe.
  3. Lancement de Internet Explorer et le test de charge page VBSARRAY.HTM.
  4. Suivez les instructions sur la page, en cliquant sur les différents boutons et d'observer le comportement qui en résulte.
L'exemple de composant a été créé à l'aide de la version ATL 2.1, y compris avec Visual C++ 5.0 dans Visual Studio 97 environnement. Si vous avez Visual Studio 97, vous pouvez charger le projet VBSARRAY directement. Dans le cas contraire, vous pouvez ouvrir le fichier source appropriée VBSA.CPP dans n'importe quel éditeur de voir comment le SAFEARRAY est construit en VARIANT et le BSTR cas. Recherchez la mise en oeuvre de Cvbsa::TestVariants et Cvbsa::TestBstrs dans le fichier source.

Les fichiers suivants sont disponibles au téléchargement à partir du centre de téléchargement Microsoft :
Vbsarray.exe
Pour plus d'informations sur la façon de télécharger des fichiers de support technique Microsoft, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la base de connaissances Microsoft :
119591Procédure pour obtenir des fichiers de support technique Microsoft auprès des services en ligne
Microsoft a analysé ce fichier pour les virus. Microsoft utilisé les logiciels de détection de virus les plus récentes ne sont associé à la date à laquelle le fichier a été validé. Le fichier est stocké sur des serveurs sécurisés, empêchant toute modification non autorisée du fichier.

Références

Référence d'Automation de plate-forme SDK

Microsoft Visual Basic Scripting Edition référence

Propriétés

Numéro d'article: 165967 - Dernière mise à jour: vendredi 7 février 2014 - Version: 4.2
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Visual Basic, Scripting Edition 1.1
  • Visual Basic, Scripting Edition 2.0
  • Visual Basic, Scripting Edition 3.0
  • Microsoft JScript 1.0
  • Microsoft JScript 2.0
  • Microsoft Internet Explorer 4.0 Édition 128 bits
  • Microsoft Active Server Pages 4.0
Mots-clés : 
kbnosurvey kbarchive kbmt kbdownload kbfile kbprb kbsample KB165967 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 165967
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com