Cómo pasar una matriz SafeArray de cadenas en una VARIANT * entre C++ y Visual Basic 6.0

Seleccione idioma Seleccione idioma
Id. de artículo: 167668 - Ver los productos a los que se aplica este artículo
Nota Microsoft Visual C++ .NET (2002) admite el modelo de código administrado suministrada por Microsoft .NET Framework y el modelo de código nativo no administrado de Microsoft Windows. La información de este artículo sólo se aplica al código no administrado de Visual C++.
Expandir todo | Contraer todo

Resumen

Cuando examine la información disponible en pasar que valores SafeArray entre Visual C++ y Visual Basic 6.0, la mayoría pasa un parámetro de la matriz SafeArray escriba VARIANT. En MFC, esto se traduce en un parámetro "Const VARIANT & nombrevar".

Como alternativa, en este artículo explora cómo pasar un VARIANT *, que en MFC se declarará como un parámetro "nombrevar VARIANT FAR *".

¿Por qué se debe utilizar un método a través de la otra? Ya que la mayoría de las aplicaciones permiten modificaciones a un SafeArray pasado un VARIANT, pero no todas. En Excel 95, puede pasar una matriz SafeArray en un VARIANT a un Visual C++ servidor, modifique los valores en el servidor, devolver el SafeArray modificado, y no hay ningún cambio en Excel 95. Otra razón para utilizar esta técnica es para evitar una limitación en Visual Basic 6.0 cuando se utiliza enlace anticipado.

Más información

Para ilustrar este concepto, comience con un nuevo proyecto "MFC AppWizard(exe)" denominado StrArray. En el "Paso 3 de 6", seleccione automatización , haga clic en Finalizar y, a continuación, haga clic en Aceptar para generar los archivos de proyecto.

Nota : si utiliza Visual Studio.NET: crear una nueva "aplicación MFC" proyecto denominado StrArray. En la ficha Características avanzadas , seleccione automatización y, a continuación, haga clic en Finalizar para generar los archivos de proyecto.

Ahora puede crear un método de automatización único mediante ClassWizard. En ClassWizard, seleccione "CStrArrayDoc" en "nombre de clase:". Haga clic en la ficha automatización y haga clic en Agregar método . Escriba los siguientes valores en el cuadro de diálogo Agregar método:

Nota : si utiliza Visual Studio.NET: agregar un método de automatización único mediante la "Vista de clases". Expanda el árbol de vista de clases y busque el VCCOdeIDLLibrary entrada. Encuentra la interfaz IStrArray en ese nodo. Haga clic con el botón secundario en la interfaz y, a continuación, seleccione Agregar método . Escriba los siguientes valores en el cuadro de diálogo Agregar método:
   External Name : Sort
   Internal Name : Sort
   Return Type   : long
   Parameter List:

      Name       : vArray
      Type       : VARIANT*
				


Haga clic en Aceptar y Editar código .

Para implementar el método Sort, utilice el método FastSort del ejemplo MFCARRAY mencionado en la siguiente sección de referencias. Esto le permite ver las diferencias entre pasar el parámetro como un "const VARIANT & nombrevar" y "VARIANT * nombrevar". Modifique el método Sort como sigue:

   ...
   #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;

   }
				


Ahora puede generar y probar el servidor de automatización. Después de crear el servidor, debe ejecutarlo como independiente para registrarlo. Ejecute Visual Basic 6.0 y cree un nuevo proyecto de Visual Basic 6.0. Coloque un botón en el formulario y modifique el controlador para que coincida con el código siguiente:

   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 clave para obtener esta sintaxis para trabajar en Visual Basic 6.0 es Dim primero la variable de matriz como una variante y, a continuación, ReDim para que sea una variante que contiene una matriz de cadenas. Ahora está preparado para probar el servidor. Establecer puntos de interrupción en el código Visual Basic 6.0 antes y después la llamada a ordenar. Ejecute la aplicación de Visual Basic 6.0, haga clic en Command1 y utilice la ventana Inspección para comprobar los valores de v.

Referencias

Para obtener más información, haga clic en los números de artículo siguientes para verlos en Microsoft Knowledge Base:
122287Límites de Visual Basic 3.0 & Disptest como controladores de automatización
131046Binary.exe transfiere datos binarios mediante automatización OLE
131086Uso de las matrices seguras en la automatización
140202MFCArray en las matrices seguras de automatización de MFC
122289Pasar estructuras de automatización OLE
154172Cómo pasar datos binarios entre un control ActiveX de VB
Microsoft Systems Journal , junio de 1996, "Preguntas y respuestas OLE", de Don Box.

(c) 1997 Microsoft Corporation, reservados todos los derechos. Contribuciones por Shawn trabajo Karr, Microsoft Corporation.

Propiedades

Id. de artículo: 167668 - Última revisión: martes, 21 de noviembre de 2006 - Versión: 3.1
La información de este artículo se refiere a:
  • Microsoft Foundation Class Library 4.2 sobre las siguientes plataformas
    • Microsoft Visual C++ 2.0 Professional Edition
    • Microsoft Visual C++ 2.1
    • Microsoft Visual C++ 2.2
    • Microsoft Visual C++ 4.0 Standard Edition
    • Microsoft Visual C++ 4.0 Standard Edition
    • Microsoft Visual C++ 4.1 Subscription
    • Microsoft Visual C++ 4.2 Professional Edition
    • Microsoft Visual C++ 4.2 Enterprise Edition
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 6.0 Enterprise
    • Microsoft Visual C++ 4.2 Professional Edition
    • Microsoft Visual C++ 5.0 Professional
    • Microsoft Visual C++ 6.0 Professional
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
    • Microsoft Visual C++ .NET 2002 Standard
  • Microsoft Visual C++ .NET 2003 Standard
Palabras clave: 
kbmt kbautomation kbfaq kbhowto KB167668 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 167668

Enviar comentarios

 

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