Capture mensajes de Windows generados por una aplicación MFC en C ++ simple dll

En primer lugar: ¿es esto posible?

Tengo un dll de terceros que conecta algún hardware. Está escrito en MFC. Recibí (de los proveedores de dll) una solución de muestra de Visual Studio 2010 que solo tiene un proyecto: una aplicación MFC (.exe) que llama al dll de terceros en cuestión. Funciona bien.

Cuando trato de usar el dll de terceros de mi dll (que es C ++ simple, sin MFC, sin .NET), puedo llamar bien a sus funciones, pero hay un problema: la aplicación MFC de muestra parece "anular" MessageProc en orden para capturar ciertos mensajes que genera la dll de terceros. Y aunque el dll tiene una función llamada "RegisterFuncCallback" y yo la uso, nunca se llama a mi devolución de llamada.

Entonces, aquí está el problema: ¿Cómo puedo capturar esos mensajes sin crear una aplicación MFC? (¿Es siquiera posible?)

preguntado el 16 de mayo de 11 a las 19:05

2 Respuestas

Muy bien, lo logré. Así es cómo:

  1. Cree una clase que herede de CWnd
  2. Declarar un mapa de mensajes asociando los mensajes deseados y sus manejadores.
  3. Al crear la ventana, use la función CreateEx (lo hice en el constructor de mi clase) y pásele el indicador HWND_MESSAGE en el último parámetro. Esto creará la ventana como una "Ventana de mensajes", es decir, invisible.
  4. Una vez que termino de inicializar la ventana y el dll de MFC, llamo a RunModalLoop en mi ventana oculta, en un hilo separado, ya que está bloqueando. Esto enciende la bomba de mensajes y comienza a recibir los mensajes de la dll de MFC.

Editar: Finalmente pude hacerlo usando solo la API de Win32. Aquí está mi historia, código incluido: Blog Programate Algo. No se preocupe, está en inglés.

Respondido el 01 de junio de 11 a las 01:06

Me acabo de dar cuenta de que CWnd es una clase de MFC, así que no lo logré. Pero estoy satisfecho con esta solución. dario_ramos

Un colega me dijo que lo que estaba haciendo con CWnd es muy fácil de hacer con llamadas WinAPI / Win32, así que ahora estoy investigando eso. Cuando termine, lo escribiré en un blog y publicaré un enlace aquí: dario_ramos

Si la DLL funciona con mensajes Win32, no los evitará. Pero no necesita necesariamente MFC para eso, una solución simple de WinAPI sería suficiente. MFC simplemente envuelve la API de Win32. Si esos mensajes no son mensajes de Win32, no necesita una aplicación Win32.

contestado el 16 de mayo de 11 a las 23:05

Eso suena mejor, Win32 debería ser mucho más fácil de encapsular. ¿Y cómo puedo hacer eso? Intenté usar la función SetWindowsHookEx, pero mi devolución de llamada aún no se llamó ... - dario_ramos

Hice algo como esto: ::SetWindowsHookEx( WH_GETMESSAGE, MyCallback, GetModuleHandle("MyDLL.DLL"), GetCurrentThreadId() ); - dario_ramos

Mientras no sepa cómo funciona realmente esta DLL, no puedo responder a esto. Y tampoco soy tan experto en Win32 (nunca utilicé el método anterior, no para hablar de mensajes de otra DLL). Solo quería decir que no necesita MFC para tareas específicas de Win32, ya que es solo un contenedor para esto. - Christian Rau

Tampoco sé cómo funciona, no tengo la fuente. Seguiré investigando el enfoque del enganche. dario_ramos

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.