PRB: Secuencia de comandos produce cuando referencias Array no variante

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
Este artículo se ha archivado. Se ofrece "tal cual" y no se volverá a actualizar.
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:
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

Advertencia: este artículo se tradujo automáticamente

Propiedades

Id. de artículo: 165967 - Última revisión: 01/23/2014 12:40:18 - Revisión: 4.2

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

  • kbnosurvey kbarchive kbmt kbdownload kbfile kbprb kbsample KB165967 KbMtes
Comentarios
ERROR: at System.Diagnostics.Process.Kill() at Microsoft.Support.SEOInfrastructureService.PhantomJS.PhantomJSRunner.WaitForExit(Process process, Int32 waitTime, StringBuilder dataBuilder, Boolean isTotalProcessTimeout)