2010-01-22 9 views
5

He estado siguiendo los 'tutoriales' de cómo exponer un .NET framework a través de COM (http://msdn.microsoft.com/en-us/library/zsfww439.aspx y http://msdn.microsoft.com/en-us/library/bd9cdfyx.aspx). Todo funciona, excepto la parte de eventos. Al agregar eventos a la interfaz de C# se genera el siguiente código de C++:Registro de controladores para el evento .NET COM en C++

struct __declspec(uuid("...")) 
_MessageEventHandler : IDispatch 
{}; 

struct __declspec(uuid("...")) 
IConnection : IDispatch 
{ 
    virtual HRESULT __stdcall add_MessageEvent (
    /*[in]*/ struct _MessageEventHandler * value) = 0; 
    virtual HRESULT __stdcall remove_MessageEvent (
    /*[in]*/ struct _MessageEventHandler * value) = 0; 
} 

El problema es que no he encontrado ninguna información sobre cómo utilizar esto en C++. ¿Debo derivar de _MessageEventHandler e implementar operator()? ¿O algo completamente diferente?

(Tenga en cuenta que por el momento También estoy tratando el enfoque más documentada de utilizar IConnectionPointContainer y IConnectionPoint.)

+0

Probablemente esperaba derivar de '_MessageEventHandler' y obtener una llamada en' IDispatch :: Invoke() 'para el evento, pero la pregunta es ¿con' DISPID'? –

Respuesta

2

Ha pasado mucho tiempo desde que utiliza COM y en ese momento yo estaba utilizando Visual C++ 6.0 . Recuerdo que implementar receptores para puntos de conexión COM no era un proceso sencillo. Había varias formas de implementarlos, dependiendo de si usaba MFC o ATL. Tal vez hay formas más fáciles ahora. Éstos son par de enlaces que pueden ayudarle a:

Code Project - Sinking events from managed code in unmanaged C++
Code Project - COM - gran número de artículos sobre COM
Code Project - Handling COM Events in a Console Application
Code Project - Handling COM Events in a Console Application, Part II

+0

Thx. El primer enlace me mostró las 'partes faltantes' :-) –

1

IDispatch se utiliza para lenguajes de enlace en tiempo de ejecución como VB, que normalmente no necesita hacer esto para un lenguaje fuertemente tipado como C#. Cuando llama a un método a través de IDispatch, lo que realmente hace es construir una matriz que contiene el método id (llamado aespid) y parámetros, luego entregarlo a una función que busca a través de una tabla de métodos encuentra uno, usa su matriz de parámetros para construir una pila de llamadas y luego llama al método. (Esto es una simplificación excesiva, por supuesto).

Así que saber que una clase implementa IDispatch casi no le dice nada.

Así que esto es ether a false lead, o le falta la declaración para las tablas de envío MessageEventHandler.

No es de extrañar que no se pueda entender cómo implementar esto, le falta algo de información vital.

Cuestiones relacionadas