[C con Clase] Parámetros de WM QUIT y PostQuitMessage() en WinAPI

Salvador Pozo salvador en conclase.net
Jue Jul 17 19:15:38 CEST 2008


El pasado 2008-07-17 16:16:20, David Reza escribió:
 
Hola:

DR> ...
DR> Sinceramente no logro entender, y empiezo a pensar que puede ser tedioso
DR> hacerme entender algo de lo que todavía no me doy cuenta.

No te preocupes. Intentaré otro enfoque.

Los mensajes se pueden enviar y recibir. Las aplicaciones pueden enviar mensajes a si mismas, a otras aplicaciones, al sistema. Del mismo modo, pueden recibir mensajes desde otras aplicaciones, de si mismas o del sistema.

Todos los mensajes tienen la misma estructura, un código UINT para codificar el tipo de mensaje, un WPARAM para codificar el wParam y un LPARAM para codificar el lParam, (entre otras cosas que ahora no nos interesan demasiado).

Por lo tanto, todos los mensajes tienen dos parámetros, tanto cuando se envían como cuando se reciben. Y tanto da si se usan ambos como si no, si los enviamos deberemos usar un valor para ambos, y si los recibimos, deberemos interpretar los dos adecuadamente.

Lo que nos explica la documentación sobre cada mensaje es con fin se pueden enviar y qué significan cuando se reciben. Esta información se complementa con el significado de cada uno de los parámetros.

En el caso concreto de WM_QUIT, la documentación no nos dice nada sobre lParam, pero sí nos dice qué significa wParam. Concretamente, nos dice que codifica un número entero con el valor de salida de la aplicación.

Si necesitamos enviar el mensaje WM_QUIT sabremos que debemos dejar lParam con valor cero, y que en wParam debemos introducir un código de salida.

Cuando lo recibimos sabremos que podemos ignorar el parámetro lParam y que debemos interpretar el parámetro wParam como un entero que contiene el código de salida.

Es decir, la documentación nos dice qué tipo de castings debemos hacer y qué macros debemos aplicar a cada parámetro para obtener los valores que necesitamos para enviar o manipular los mensajes.

Cuando digo que no debes interpretar literalmente la sintaxis de la documentación de los mensajes, me refiero a que la sintaxis de los parámetros no debe interpretarse como asignaciones, ya que depende en gran medida del sentido en que se muevan los mensajes: envío o recepción.

Tienes razón, seguramente, dentro de la función PostQuitMessaje exista una asignación del tipo wParam = (WPARAM)nExitCode.

Pero, sinceramente, en general no me preocupa demasiado saber por qué procesos ha pasado un mensaje desde su emisión hasta su recepción. No necesito saber esto para programar. En este caso, seguramente el proceso es muy simple, PostQuitMessage invocará a PostMessage, y esta función sólo añadirá el mensaje a la cola de mensajes, lo cual se reduce a unas pocas asignaciones (sobre todo teniendo en cuenta que esa cola está limitada, y si se llena, la función que envía el mensaje fracasa).

DR> Lamentablemente soy una persona que cuando no entiende algo, me quedo
DR> trabado en ello hasta que le entiendo, para que el desconocimiento de ese
DR> "algo" no perjudique mi aprendizaje en lo que resta del curso.

Afortunadamente, algunos de los que a veces respondemos mensajes somos bastante cabezotas, de modo que insistiré hasta que los dos entendamos este tema. :-)

DR> Sólo pediré paciencia, jeje.

Pues no faltará.


-- 
Salvador Pozo (Administrador)
mailto:salvador en conclase.net


Más información sobre la lista de distribución Cconclase