Cómo Devolver Correctamente un Array de Cadenas de un Objeto ActiveX a JScript

Si estás trabajando con una API de Win32 y necesitas devolver un array de cadenas de un objeto ActiveX a JScript, puedes encontrarte con algunos desafíos. Este problema típicamente surge cuando las cadenas parecen ‘perderse’ durante la transferencia. Comprender la relación entre objetos COM, ActiveX y JScript es crucial para un manejo exitoso de datos en estos entornos. En esta publicación del blog, te guiaremos a través del enfoque correcto para lograr esto.

El Problema

Has definido una interfaz en tu archivo IDL (Lenguaje de Definición de Interfaces) para un objeto COM que incluye un método que devuelve un array de cadenas. Específicamente, la firma de la función aparece de la siguiente manera:

HRESULT GetArrayOfStrings([out, retval] SAFEARRAY(BSTR) * rgBstrStringArray);

Mientras que la función en sí opera correctamente, el problema surge cuando las cadenas se asignan a una variable en JavaScript, resultando en que las cadenas aparentemente se pierden. Necesitamos asegurar que los datos se transfieran correctamente.

La Solución

Para pasar correctamente el array de cadenas de tu objeto ActiveX a JScript, sigue estos pasos detallados:

Paso 1: Envolver el SAFEARRAY en un VARIANT

Para facilitar la comunicación entre el objeto COM y JScript, necesitas envolver el SAFEARRAY en un VARIANT antes de devolverlo. Esto permite un manejo adecuado del array y asegura que no se produzca pérdida de datos. A continuación, se muestra el código de función modificado para lograr esto:

HRESULT GetArrayOfStrings(/*[out, retval]*/ VARIANT* pvarBstrStringArray)
{
   // Declarar un variant para sostener el array.
   _variant_t ret;
   // Configurar el tipo de variant como un array de variants.
   ret.vt = VT_ARRAY | VT_VARIANT;
   ret.parray = rgBstrStringArray; // Asignar el SAFEARRAY.
   *pvarBstrStringArray = ret.Detach(); // Desprenderlo para regresar.
   return S_OK; // Devolver éxito.
}

Paso 2: Usar VBArray en JScript

Una vez que los datos están envueltos en un VARIANT y se devuelven con éxito desde ActiveX, puedes utilizar el objeto VBArray en tu código JScript para desempaquetar los datos adecuadamente. La línea de código que necesitarás es:

var jsFriendlyStrings = new VBArray(axOb.GetArrayOfStrings()).toArray();

Esta única línea convierte efectivamente el VARIANT devuelto en un array de cadenas amigable con JavaScript, permitiéndote manejar los datos según sea necesario.

Conclusión

Manejar la transferencia de un array de cadenas de un objeto ActiveX a JScript se reduce a comprender cómo manipular objetos COM y las interacciones de JavaScript. Al envolver tu SAFEARRAY en un VARIANT y usar el VBArray para desempacarlo, puedes asegurar que todos los datos se pasen correctamente sin pérdida.

Ahora, deberías estar equipado con el enfoque adecuado para devolver y utilizar con éxito arrays de cadenas en tus scripts administrativos. ¡Feliz programación!