Pregunta

Necesito llamar a una API de Win32 para obtener una serie de cadenas y me gustaría devolver una matriz de esas cadenas a JavaScript.Esto es para secuencias de comandos que se ejecutan en la máquina local para secuencias de comandos de administración, no para el navegador web.

Mi archivo IDL para el objeto COM tiene la interfaz a la que estoy llamando como:

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

La función regresa correctamente, pero las cadenas se "pierden" cuando se asignan a una variable en JavaScript.

La pregunta es:¿Cuál es la forma correcta de devolver la matriz de cadenas a una variable de JavaScript?­­­­­­­­­­­­­­­­­­­­­­­­

¿Fue útil?

Solución

Si no recuerdo mal, tendrás que envolver el SAFEARRAY en un VARIANT para que pueda pasar, y luego usar un Objeto VBArray para descomprimirlo en el lado JS de las cosas:

HRESULT GetArrayOfStrings(/*[out, retval]*/ VARIANT* pvarBstrStringArray)
{
   // ...

   _variant_t ret;
   ret.vt = VT_ARRAY|VT_VARIANT;
   ret.parray = rgBstrStringArray;
   *pvarBstrStringArray = ret.Detach();
   return S_OK;
}

entonces

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

Otros consejos

shog9es correcto.Las secuencias de comandos COM requieren que todas las salidas sean VARIANTES.

De hecho, también requiere que todos los ENTRADAS también sean VARIANTES: vea los detalles desagradables de IDispatch en su archivo de ayuda favorito.Solo se piensa en la magia de la implementación de la interfaz dual por parte de ATL y capas similares (que probablemente es lo que estás usando) que no tienes que preocuparte por eso.Las VARIANT de entrada pasadas por el código de llamada se convierten para que coincidan con la firma de su método antes de llamar a su método real.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top