2009-10-28 16 views
5

Revisando nuestro código que he encontrado una curiosa definición en uno de los archivos .idl:¿Algún sentido al marcar una interfaz IUnknown-derived como dual en IDL?

[ 
    object, 
    uuid(uuidhere), 
    dual, 
    nonextensible, 
    oleautomation, 
    hidden 
] 
interface IOurInterface : IUnknown { 
    //methods here 
}; 

¿Cómo puede una interfaz derivada directamente de IUnknown posiblemente ser una interfaz dual? ¿Se romperá algo si elimino el atributo dual?

Respuesta

3

En this answer a otra pregunta relativa cálculo de referencias user voyce puntos a this article que, básicamente, establece lo siguiente:

Cuando cualquier interfaz (IDispatch-deriva o no) está marcado ya sea dual o oleautomation (o ambos) se trata de forma especial cuando RegisterTypeLib() se invoca (que normalmente lo hace DllRegisterServer). Para cada interfaz se crea una clave HKCR \ Interface {InterfaceId} en la que se hace referencia a la clase {00020424-0000-0000-C0000-000000000046} como proxy/stub. Esta identificación de clase corresponde a typelib marshaller también conocido como oleautomation marshaller.

+0

Ah sí, eso es correcto. Como ya tenías 'oleautomation', pensé que estaba implícito ... aunque no sabía las especificaciones exactas, ¡gracias por el seguimiento! –

+0

Y todavía creo que debes asegurarte de que el objeto no responde actualmente a QI para 'IDispatch' antes de eliminarlo. –

+0

Sí, estoy completamente de acuerdo sobre la respuesta QI con IDispatch. – sharptooth

1

no puedo ver una razón que eso funcionaría, teniendo en cuenta los documentos aquí: http://msdn.microsoft.com/en-us/library/aa366807(VS.85).aspx

interfaces identificadas por el atributo de doble deben ser compatibles con Automatización y ser derivado de IDispatch. Este atributo no es permitido en dispinterfaces.

Podría ser que el atributo [dual] implícitamente agrega IDispatch a la interfaz.

Lo que podría hacer es comprobar el código que implementa la interfaz (suponiendo que esto es ATL) si se deriva de IDispatchImpl. Si es así, en realidad responde a QI para IDispatch y puede usarse como tal.

Otra alternativa es instanciar un objeto que implementa IOurInterface y QI para IDispatch - si tiene éxito, es probable que no pueda eliminarlo.

En realidad, pensándolo bien, tal vez [dual] técnicamente no requiera derivar de IDispatch mientras implemente tanto su interfaz personalizada como IDispatch?

Cuestiones relacionadas