GetWindowText() en ropa interior

Justo he empezado a leer The old new thing de Raymond Chen, que es un libro entresacado a partir de las entradas más interesantes del blog del autor. Y me está gustando tanto que lo estoy leyendo como si fuera una novela de aventuras, sección tras sección. En él hay un curioso capítulo que trata de las interioridades de la función de Win32 GetWindowText() que no he podido reprimirme en parafrasearlo aquí.

Para aquel que no lo sepa, dicha función devuelve en uno de sus parámetros el título de la ventana o el texto contenido en un control, dependiendo sobre qué tipo de ventana se ejecute.

Lo curioso es ver cómo funciona. Si la llamamos sobre una ventana de nuestro propio proceso, la función genera el mensaje WM_GETTEXT para que seamos nosotros mismos los que devolvamos el texto que queramos. Evidentemente si no capturamos el mensaje, será Windows quien devuelva el valor por defecto, que será el mismo que si se realiza la llamada a una ventana de otro proceso. En este caso, la función devolverá la cadena que Windows ha almacenado interiormente y que contendrá lo dicho.

Curioso, ¿no? De hecho en el libro de Raymod viene un ejemplo para hacer que una ventana devuelva un texto diferente según se llame desde el mismo proceso o fuera de él.

¿Por qué funciona esto así?

Según Chen es muy sencillo, y viene de la herencia de Windows 1.0 y versiones posteriores en las que la multitarea era cooperativa.

Imaginemos que vamos a mostrar la lista de programas en ejecución. Para ello, el programa enumerará todas las ventanas principales de Windows y les pedirá su nombre a través de GetWindowText(). Ahora supongamos que uno de esos procesos está colgado por algún motivo. Si la función genera un WM_GETTEXT sobre dicho proceso tonto, Windows al completo se quedaría bloqueado porque al no procesar el mensaje, la función nunca retornaría y un supuesto programa “matador” de procesos que no responden también se colgaría…

Por lo tanto, los diseñadores de Windows decidieron que una llamada a GetWindowText() debería comportarse tal y como se ha descrito más arriba. Es decir, si un proceso usa la función sobre sí mismo, es indicativo de que el bucle de mensajes está funcionando bien y por tanto podrá responder a un WM_GETTEXT. Pero si se hace desde otro proceso, nadie garantiza que el bucle de mensajes del llamado esté funcionando bien, por lo que entonces Windows toma el valor almacenado internamente, que generalmente es el nombre de la clase de ventana o el título de la misma.

De este modo, al menos desde Windows 95, un proceso tonto no tumba al sistema cuando intentemos matarlo desde el Administrador de Tareas o desde cualquier otro programa enumerador.

4 comentarios en “GetWindowText() en ropa interior”

  1. Jo .. interesante saber que estas “design features” se mantienen más de 10 años después. Una buena solución no tiene edad 😀

    Salu2

  2. Muy interesante. Intentaré buscar algo del libro.

    El blog de Raymond Chen es un verdadero tesoro, aunque ya hay tanto contenido publicado y tan variado que es difícil encontrar todas las entradas que traten sobre un tema concreto (por ejemplo, lo endiabladamente complejo que es COM o las mil “sutilezas” de las API de Windows), por lo que hay que ir “picoteando” aquí y allá. Supongo que por eso decidiría en su momento recopilar en un libro una selección de sus escritos. No os perdáis tampoco su columna Windows Confidential en la revista de TechNet.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *