PRB: Secuencia de comandos produce cuando referencias Array no variante

Seleccione idioma Seleccione idioma
Id. de artículo: 165967 - Ver los productos a los que se aplica este artículo
Este artículo se ha archivado. Se ofrece "tal cual" y no se volverá a actualizar.
Expandir todo | Contraer todo

Síntomas

Cuando una secuencia de comandos intenta hacer referencia a los elementos de la matriz devuelta por un componente, el motor de secuencias de comandos informa:
<object><method>"Objeto no admite esta propiedad o método ' <objeto>. <método> '"

Causa

El motor de secuencias de comandos VBSCRIPT activo suministrado por Microsoft sólo admite la indización de SafeArray de Variant. Aunque VBSCRIPT es capaz de aceptar las matrices de tipo variant no los fines de comprobación de límite y pasarla a otro automatización objetos, el motor no permite la manipulación del contenido de matriz en este momento.

El motor de secuencias de comandos de JSCRIPT activo no ofrece soporte para probar los límites o indización SafeArray de cualquier tipo incluidos Variant. Sin embargo, JSCRIPT es capaz de pasar SAFEARRAY de un objeto de automatización a otro.

Solución

Para funcionar correctamente con aplicaciones y componentes que host VBSCRIPT, objetos de automatización deben crear SafeArray de Variant. Datos de VARIANT no deben empaquetarse en los elementos VARIANT de SAFEARRAY se devuelva al motor VBSCRIPT.

Secuencias de comandos escritas en VBSCRIPT deben utilizar la función TypeName para comprobar el tipo de datos de una variable. La función TypeName devuelve la cadena "Variant()", excepto las comillas, cuando se pasa una matriz de Variant.

Secuencias de comandos escritas en JSCRIPT deben utilizar el operador typeof para probar el tipo de datos de una variable. El operador typeof devuelve la cadena "desconocido", excepto las comillas para tipos de datos no compatible con JSCRIPT.

Estado

Este comportamiento es por diseño.

Más información

El VBSARRAY es un simple Active Template Library (ATL) versión 2.1 del objeto de componente que muestra este comportamiento. El componente implementa una interfaz dual Ivbsa que admite tres métodos: TestBstrs, TestVariants y TestPassArray. El primero muestra el problema devolviendo un SAFEARRAY de BSTR. El segundo muestra la solución empaquetando cada BSTR en VARIANT. La tercera muestra que una matriz de tipo VARIANT no se puede pasar del componente a VBSCRIPT o JSCRIPT a componente. Los datos permanecen intactos.

Aquí es la implementación 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;
   }
				
aquí es el código JSCRIPT desde VBSARRAY.HTM, incluido con el ejemplo, que comprueba el tipo de datos de una variable de la página de prueba:
      <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>
				
Para demostrar el problema y la solución, siga estos pasos:

  1. Siga las instrucciones a continuación sobre cómo obtener el componente de ejemplo VBSARRAY.DLL y página VBSARRAY.HTM de ejemplo.
  2. Registrar el componente VBSARRAY.DLL mediante una herramienta como por ejemplo regsvr32.exe.
  3. Iniciar Internet Explorer y la prueba de carga de página VBSARRAY.HTM.
  4. Siga las instrucciones en la página, haciendo clic en los distintos botones y observar el comportamiento resultante.
El componente de ejemplo creado usando la versión 2.1 incluidos con Visual C++ 5.0 en Visual Studio 97 entorno de Active Template Library. Si tiene Visual Studio 97, puede cargar el proyecto VBSARRAY directamente. En caso contrario, puede abrir el archivo de origen correspondiente VBSA.CPP en cualquier editor para ver cómo está construido el SAFEARRAY tanto el VARIANT en BSTR casos. Busca la implementación de Cvbsa::TestVariants y Cvbsa::TestBstrs en el archivo de origen.

Los archivos siguientes están disponibles para descargarlos del Centro de descarga de Microsoft:
Vbsarray.exe
Para obtener información adicional acerca de cómo descargar los archivos de soporte técnico de Microsoft, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
119591Cómo obtener Archivos de soporte técnico de Microsoft desde los servicios en línea
Microsoft exploró este archivo en busca de virus. con el software de detección de virus más reciente disponible en la fecha de publicación. Asimismo, el archivo se almacenó en servidores seguros que ayudan a impedir la realización de cambios no autorizados.

Referencias

Referencia de automatización de SDK de plataforma

Microsoft Visual Basic referencia de idioma de edición de Scripting

Propiedades

Id. de artículo: 165967 - Última revisión: jueves, 23 de enero de 2014 - Versión: 4.2
La información de este artículo se refiere a:
  • 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 128-Bit Edition
  • Microsoft Active Server Pages 4.0
Palabras clave: 
kbnosurvey kbarchive kbmt kbdownload kbfile kbprb kbsample KB165967 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): 165967

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