Comment passer un SafeArray de chaînes dans un VARIANT * entre Visual C++ et Visual Basic 6.0

Traductions disponibles Traductions disponibles
Numéro d'article: 167668 - Voir les produits auxquels s'applique cet article
Remarque Microsoft Visual C++ .NET (2002) prend en charge le modèle de code managé qui est fourni par Microsoft .NET Framework et le modèle de code Microsoft Windows natif non managé. Les informations contenues dans cet article s'appliquent uniquement au code de Visual C++ non managé.
Agrandir tout | Réduire tout

Résumé

Lorsque vous examinez les informations disponibles sur le passage de que SafeArrays entre Visual C++ et Visual Basic 6.0, la plupart passer SafeArray un paramètre tapez VARIANT. Dans MFC, cela se traduit par un paramètre "const VARIANT & varName".

Comme alternative, cet article explore comment passer un VARIANT *, qui, dans MFC, sera déclaré en tant que paramètre "nomvar VARIANT FAR *".

Pourquoi utiliser une méthode par rapport à l'autre ? Car la plupart des applications autorise les modifications apportées à un SafeArray transmis dans un VARIANT, mais pas tous. Dans Excel 95, vous pouvez passer des SafeArray dans un VARIANT à une Visual C++ server, modifiez les valeurs dans le serveur, renvoyer SafeArray modifié, et il n'existe pas de modification d'Excel 95. Une autre raison pour utiliser cette technique est de contourner une limitation dans Visual Basic 6.0 lorsque vous utilisez une liaison anticipée.

Plus d'informations

Pour illustrer ce concept, démarrer avec un nouveau projet "MFC AppWizard(exe)" appelée StrArray. Dans «Étape 3 de 6», sélectionnez Automation, cliquez sur Terminer et puis cliquez sur OK pour générer les fichiers de projet.

Remarque : Si vous utilisez Visual Studio.NET : créer une nouvelle «application MFC «projet appelé StrArray. Sous l'onglet Fonctionnalités avancées, sélectionnez Automation, puis cliquez sur Terminer pour générer les fichiers de projet.

Maintenant créer une méthode automation unique à l'aide de ClassWizard. Dans ClassWizard, sélectionnez «CStrArrayDoc» sous "le nom de classe:". Cliquez sur l'onglet Automation, puis sur Ajouter une méthode. Dans la boîte de dialogue Ajouter une méthode, entrez les valeurs suivantes :

Remarque : Si vous utilisez Visual Studio.NET : ajouter une méthode automation unique à l'aide de «Affichage de classes». Développez l'arborescence de l'affichage de classes et recherchez le VCCOdeIDLLibrary entrée. Trouver l'interface IStrArray sous ce noeud. Cliquez avec le bouton droit sur l'interface, puis sélectionnez Ajouter une méthode. Entrez les valeurs suivantes dans la boîte de dialogue Ajouter une méthode :
   External Name : Sort
   Internal Name : Sort
   Return Type   : long
   Parameter List:

      Name       : vArray
      Type       : VARIANT*
				


Cliquez sur OK, puis sur Modifier le code.

Pour implémenter la méthode Sort, utilisez la méthode FastSort de l'échantillon MFCARRAY mentionné dans la section Références ci-dessous. Cela vous permet de voir les différences entre en passant le paramètre comme un "const VARIANT & varName" et "VARIANT * nomvar". Modifiez la méthode de tri comme suit :

   ...
   #include <afxpriv.h>
   ...
   long CStrArrayDoc::Sort(VARIANT FAR* vArray)
   {

      long i, j, min;
      BSTR bstrTemp;
      SAFEARRAY FAR* psa = NULL;
      BSTR HUGEP *pbstr;
      HRESULT hr;
      DWORD dwTimeStart;
      LONG cElements, lLBound, lUBound;

      USES_CONVERSION;

      // Type check VARIANT parameter. It should contain a BSTR array
      // passed by reference. The array must be passed by reference it is
      // an in-out-parameter.
      if (V_VT(vArray) != (VT_ARRAY | VT_BSTR))
         AfxThrowOleDispatchException(1001,
           "Type Mismatch in Parameter. Pass a string array by reference");
      psa = V_ARRAY(vArray);
      // Check dimensions of the array.
      if (SafeArrayGetDim(psa) != 1)
         AfxThrowOleDispatchException(1002,
           "Type Mismatch in Parameter. Pass a one-dimensional array");

      dwTimeStart = GetTickCount();

      // Get array bounds.
      hr = SafeArrayGetLBound(psa, 1, &lLBound);
      if (FAILED(hr))
          goto error;
      hr = SafeArrayGetUBound(psa, 1, &lUBound);
      if (FAILED(hr))
          goto error;

      // Get a pointer to the elements of the array.
      hr = SafeArrayAccessData(psa, (void HUGEP* FAR*)&pbstr);
      if (FAILED(hr))
         goto error;

      // Bubble sort.
      cElements = lUBound-lLBound+1;
      for (i = 0; i < cElements-1; i++)
      {
         min = i;
         for (j = i+1; j < cElements; j++)
         {
            // NULL is a valid value for a BSTR. This code treats a NULL
            // BSTR as less than other string values.
            if (pbstr[min] == NULL)
               continue;
            else if (pbstr[j] == NULL
               || wcscmp(pbstr[j], pbstr[min]) < 0)
               min = j;
         }

         //Swap array[min] and array[i].
         bstrTemp = pbstr[min];
         pbstr[min] = pbstr[i];
         pbstr[i] = bstrTemp;
      }

      hr = SafeArrayUnaccessData(psa);
      if (FAILED(hr))
         goto error;

      return GetTickCount()-dwTimeStart;

   error:

      AfxThrowOleDispatchException(1003,
        "Unexpected Failure in FastSort method");
      return 0;

   }
				


Vous pouvez maintenant créer et tester le serveur automation. Après avoir créé le serveur, l'exécuter en tant qu'autonome pour l'enregistrer. Exécutez Visual Basic 6.0 et créez un nouveau projet Visual Basic 6.0. Placez un bouton du formulaire et modifiez le gestionnaire pour qu'il corresponde au code ci-dessous :

   Private Sub Command1_Click()
      Dim o As Object
      Dim v As Variant
      ReDim v(50) As String
      Dim SortTime As Long

      Set o = CreateObject("StrArray.Document")

      upperbound = 1
      lowerbound = 100
      For n = 0 To 50
          v(n) = "Entry " & Int((upperbound-lowerbound+1)*Rnd+lowerbound)
      Next n

      SortTime = o.Sort(v)
      MsgBox ("Done")
   End Sub
				


La clé de l'obtention de cette syntaxe fonctionne dans Visual Basic 6.0 est pour la première Dim la variable tableau en tant que variant et puis le ReDim afin qu'il se transforme en une variable variant contenant un tableau de chaînes. Vous êtes maintenant prêt à tester le serveur. Définir des points d'arrêt dans le code Visual Basic 6.0 avant et après l'appel à trier. Exécutez l'application Visual Basic 6.0, cliquez sur Command1 et utilisez la fenêtre Espion pour vérifiez que les valeurs v.

Références

Pour plus d'informations, cliquez sur les numéros ci-dessous pour afficher les articles correspondants dans la base de connaissances Microsoft :
122287Limites de Visual Basic 3.0 & Disptest en tant que contrôleurs automation
131046Binary.exe transfère les données binaires à l'aide de OLE automation
131086Utilisation des tableaux sécurisés dans automation
140202MFCArray à l'aide des tableaux sécurisés dans MFC automation
122289Passage de structures dans OLE automation
154172Comment passer des données binaires entre un contrôle ActiveX et VB
Microsoft Systems Journal, juin 1996, «Questions et réponses OLE» par Don Box.

(c) 1997 Microsoft Corporation, tous droits réservés. Contribution de Shawn w. Karr, Microsoft Corporation.

Propriétés

Numéro d'article: 167668 - Dernière mise à jour: mardi 21 novembre 2006 - Version: 3.1
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Foundation Class Library 4.2 sur le système suivant
    • Microsoft Visual C++ 2.0 Édition Professionnelle
    • Microsoft Visual C++ 2.1
    • Microsoft Visual C++ 2.2
    • Microsoft Visual C++ 4.0 Édition Standard
    • Microsoft Visual C++ 4.0 Édition Standard
    • Microsoft Visual C++ 4.1 Subscription
    • Microsoft Visual C++ 4.2 Édition Professionnelle
    • Microsoft Visual C++ 4.2 Édition Entreprise
    • Microsoft Visual C++ 5.0 Édition Entreprise
    • Microsoft Visual C++ 6.0 Édition Entreprise
    • Microsoft Visual C++ 4.2 Édition Professionnelle
    • Microsoft Visual C++ 5.0 Édition Professionnelle
    • Microsoft Visual C++ 6.0 Édition Professionnelle
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
    • Microsoft Visual C++ .NET 2002 Initiation
  • Microsoft Visual C++ .NET 2003 Initiation
Mots-clés : 
kbmt kbautomation kbfaq kbhowto KB167668 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: 167668
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