El efecto WINVER y tooltips de tipo balón

¿Porqué el compilador de C++ no encuentra una función, mensaje o estructura del API de Windows? A menudo recibo esta pregunta. Resulta que el compilador de C++ no encuentra algún simbolo definido en un archivo de cabecera de Windows. A menudo nos ocurre esto cuando queremos utilizar alguna funcionalidad 'recien salida del horno' y que no esta prensente en versiones anteriores de Windows.

El error que se recibe habitualmente es: error C2065: 'IDENTIFICADOR' : undeclared identifier

Evidentemente lo primero es descartar que hayamos olvidado incluir el archivo de cabecera donde este declarado el identificador en cuestión. Para ello lo mejor es asegurarse de cúal es este archivo de cabecera consultando la MSDN sobre la función, estructura o mensaje que deseamos utilizar y que está provocando el error.

Una vez optenida esta información y seguros de no haber cometidos errores podemos encontrarnos con la sopresa de que el archivo de cabecera ¡realmente no incluye el identificador en cuestión!. Bueno, que no cunda el pánico. Es habitual que para programar utilicemos las cabeceras que trae Visual Studio con sigo. Lo que ocurre es que estas cabeceras pueden tener ya unos añitos y por lo tanto no incluir la funcionalidad que nosotros necesitamos. La solución: descargar el último SDK disponible, lo que por otra parte siempre es recomendable.

Incluso con la cabecera correcta incluida y el útimo SDK podemos encontranos con que el compilador ¡sigue sin encontrar el puñetero simbolo!. ¿Pero como @$#%&¡ puede ser?, ¡si incluso viendo el archivo de cabecera el simbolo esta ahí!. El motivo es que las cabeceras del API de Windows, incorporan un mecanismo que nos permite asegurar cuales son los requisitos minimos en cuanto a sistema operativo de nuestro programa. Se trata de una serie de macros que hemos de definir para declarar cual es el sistema operativo mínimo, estás macro que debemos definir son NTDDI_VERSION o WINVER. Para conocer los valores de estas macros para cada version de Windows debemos consultar 'Using the Windows Headers' en MSDN, por lo menos hasta que nos sepamos los valores.

Para saber cual es la versión del sistema operativo que es necesaria para usar una función, estructura o mensaje debemos acudir de nuevo a la MSDN.

Asi, por ejemplo para usar el mensaje EM_SHOWBALLONTIP, que permite mostrar tooltips de tipo balón:

vímos en la MSDN que como mínimo necesitamos Windows XP y por lo tanto debemos definir _WIN32_WINNT>=0x0501 y WINVER>=0x0501. Para ello tenemos dos opciones:

Poner un #define en stdafx.h

#define WINVER=0x0501

#define WIN32_WINNT>=0x0501

O en la configuración del proyecto en C/C++->Preporcessor->Preprocesor Definitions añadir WINVER=0x0501 y _WIN32_WINNT>=0x0501. Esta es la que yo prefiero.

Aún con esto y con todo, queda otro motivo por el que puede ser que no se encuentre el identificador, porque tengamos definido WIN32_LEAN_AND_MEAN que excluye de las cabeceras de Windows las funciones que no se usan habitualmente. Bastaría con eliminar la definición

#define WIN32_LEAN_AND_MEAN   

de stdafx.h

Deja un comentario

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