2008-11-16 18 views
5

Nuestro proyecto se ejecuta en Windows CE 6.0 y está escrito en C++. Tenemos algunos problemas con el código y no podemos depurar. También descubrimos que si en nuestra aplicación creamos hilos y tratamos de printf de ellos, la salida no aparecerá. La única salida que aparecerá es la del hilo principal. Me gustaría hacer lo siguiente:¿Cómo podría crear un mensaje de Windows personalizado?

  • crear un mensaje ventanas personalizadas uso

  • ya que es WPARAM la dirección de un char * Quiero mostrar en la pantalla

  • uso, ya que es LPARAM la longitud de la char * Quiero mostrar en la pantalla

  • enviar el mensaje

  • proceso que cuando se trata, para que se imprima el char *

¿Cómo podría crear el mensaje de ventanas personalizadas? ¿Cuáles son los tipos de WPARAM y LPARAM? ¿Es posible hacer lo que acabo de escribir?

Gracias

+0

Un MessageBox no funciona para usted en esta situación? ¿Estás usando MFC? – Klathzazt

+0

No es una opción. Habrá un montón de "strings" – Geo

Respuesta

5

Es posible hacer lo que usted describe. No necesita hacer nada para crear un mensaje personalizado para la comunicación dentro de su aplicación: simplemente asegúrese de que el código que envía el mensaje y el código que recibe el mensaje coinciden en cuál es realmente el número de mensaje, y use un mensaje. número que no se superpone con ninguno de los números que usa Windows. Hay una función RegisterWindowMessage(), pero eso solo es necesario para obtener un número de mensaje único en todo el sistema operativo, por lo que se usa para la comunicación entre procesos.

La forma más sencilla de lograrlo es tener sólo un archivo de cabecera en alguna parte que contiene los números de mensajes personalizados, a partir de WM_USER y numeración hacia arriba, así:

#define WM_FIRST_CUSTOM_MSG (WM_USER+0) 
#define WM_SECOND_CUSTOM_MSG (WM_USER+1) 

Los tipos wParam y lParam se definen cuando se incluye "windows.h", por lo que puede tener diferentes tipos en diferentes sistemas. Para sistemas operativos de 32 bits, ambos son generalmente enteros de 32 bits. Si solo está usando el mensaje para fines de prueba, por lo general es lo suficientemente bueno, y puede guardar lo que quiera allí. Para el código de producción, sin embargo, debe tener más cuidado: WPARAM es realmente para datos "enteros" y LPARAM para datos "tipo puntero". En Win64, por ejemplo, LPARAM es lo suficientemente largo como para contener un puntero de 64 bits, pero WPARAM solo contiene un entero de 32 bits. Para pasar más datos que solo un entero y un puntero, usaría lParam para pasar un puntero a algún tipo de estructura que contenga todos mis argumentos.

Habiendo dicho todo eso, parece una forma complicada de obtener resultados de depuración. ¿Has intentado utilizar la llamada API OutputDebugString()? ¿O eliminando errores de la llamada printf() del hilo?

+0

Sé que esta es una forma complicada de depuración. Mencioné antes que no podemos depurar el sistema. No estoy seguro de que OutputDebugString se muestre si se llama desde otro hilo. – Geo

+6

Los mensajes específicos de la aplicación se deben basar en WM_APP, no en WM_USER. Consulte http://blogs.msdn.com/oldnewthing/archive/2003/12/02/55914.aspx – ChrisN

+1

De hecho, los mensajes privados de la aplicación ** deben ** estar en el rango 'WM_APP + x'.Los mensajes 'WM_USER + x' son definidos por el autor de una clase de ventana, o más formalmente, por quien llama' RegisterClassEx'. Reutilizar este rango se va a romper. Los detalles se pueden encontrar en [Acerca de mensajes y colas de mensajes: mensajes definidos por la aplicación] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms644927.aspx#app_defined). – IInspectable

Cuestiones relacionadas