¿Cómo puedo pasar una matriz de estructuras (que contiene std: cuerda o BSTR) desde ATL a C #. SafeArray? ¿Variante?

StackOverflow https://stackoverflow.com/questions/2775299

Pregunta

Tengo un objeto COM de ATL que estoy usando desde C #. La interfaz actualmente se ve así:

interface ICHASCom : IDispatch{
    [id(1), helpstring("method Start")] HRESULT Start([in] BSTR name, [out,retval] VARIANT_BOOL* result);
...
    [id(4), helpstring("method GetCount")] HRESULT GetCount([out,retval] LONG* numPorts);
...

    [id(7), helpstring("method EnableLogging")] HRESULT EnableLogging([in] VARIANT_BOOL enableLogging);
};

Es decir, se trata de una interfaz muy simple. También tengo algunos eventos que envío de vuelta también. Ahora, me gustaría añadir algo a la interfaz. En el ATL Tengo algunos resultados, que son actualmente y se ven como estructuras struct REPORT_LINE { fechaCreacion cadena; ID de cadena; Resumen de cuerda; }; Todos los miembros de la estructura son std :: string. Tengo una gran variedad de estos que tengo que volver a la C #. ¿Cuál es la mejor manera de hacer esto?

sospecho que alguien va a decir, "bueno, no se puede mandar std :: string el COM así. Si es así, bien, pero ¿cuál es la mejor manera de modidfy la estructura? Cambie el std :: string a BSTR? Y entonces, ¿cómo hacer que, 1) Establecer el IDL para pasar una matriz de estructuras (estructuras con BSTR o std :: string) 2) Si debo utilizar SafeArrays, ¿cómo puedo rellenar los SafeArrays con las estructuras.

No estoy familiarizado con el COM, excepto para su uso con los tipos simples.

¿Fue útil?

Solución

una estructura definida por el usuario es incompatible con la interfaz de automatización. Es probable que pueda elaborar un conjunto anidado o dos matriz segura dimensional de BSTR, pero una solución más fácil de mantener sería envolver la estructura como un objeto de automatización con 3 propiedades, luego envolver la matriz como una colección que tiene un enumerador.

Ni IDL ni Automatización definen la alineación de bytes de una estructura. Lo que puede tener problemas de compatibilidad si su servidor COM tiene diferente estructura de alineación con el cliente. p.ej. VB tiene una alineación de 4 bytes, mientras que el import en defecto Visual ++ C a una alineación de 8 bytes. Si usted tiene una mínima posibilidad en el futuro para utilizar la interfaz de secuencias de comandos, evitar el uso de estructuras.

Lectura recomendada:

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