2008-09-05 9 views
5

Necesito llamar a una API Win32 para obtener una serie de cadenas, y me gustaría devolver una matriz de esas cadenas a JavaScript. Esto es para la secuencia de comandos que se ejecuta en la máquina local para las secuencias de comandos de administración, no para el navegador web.Cómo devuelvo una matriz de cadenas de un objeto ActiveX a JScript

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

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

La función devuelve correctamente, pero las cuerdas están consiguiendo 'perdido' cuando están siendo asignados a una variable en JavaScript.

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

Respuesta

6

Si no recuerdo mal, que necesita para envolver el SAFEARRAY en un VARIANT el fin a que se haga a través, y luego usar un VBArray object a descomprimirlo en el lado de las cosas JS:

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

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

continuación

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

En caso de que la declaración return ret.Detach() en realidad sea > pvarBstrStringArray = ret.Detach(); Gracias – Mark

1

Shog9 es correcta. El scripting COM requiere que todas las salidas sean VARIANTES.

De hecho, también requiere que todas las ENTRADAS sean VARIANTES también - vea los desagradables detalles de IDispatch en su archivo de ayuda favorito. Solo se piensa que la magia de la implementación de Dual Interface por parte de ATL y capas similares (lo que probablemente es lo que estás usando) no te tiene que preocupar por eso. Los VARIANTES de entrada pasados ​​por el código de llamada se convierten para que coincidan con la firma de su método antes de que se llame a su método real.

Cuestiones relacionadas