Which header files are included in Windows 10?

Guía Esencial de los Headers de Windows

04/02/2016

Valoración: 4.74 (4383 votos)

Adentrarse en el desarrollo de aplicaciones para el ecosistema Windows implica, inevitablemente, toparse con un concepto fundamental: los archivos de encabezado o 'headers'. Estos archivos son la piedra angular para cualquier programador que desee interactuar con el sistema operativo a un nivel profundo, permitiendo la creación de aplicaciones robustas, eficientes y compatibles. Lejos de ser meros archivos de texto, son el puente que conecta nuestro código fuente con la vasta y potente Windows API (Interfaz de Programación de Aplicaciones). En esta guía exhaustiva, desglosaremos qué son, cómo funcionan y las mejores prácticas para utilizarlos, especialmente en un entorno de desarrollo con C++ y Visual Studio.

What is a Windows header file?
The Windows header files use macros to indicate which versions of Windows support many programming elements. Therefore, you must define these macros to use new functionality introduced in each major operating system release.
Índice de Contenido

¿Qué son y para qué sirven los Headers de Windows?

Los archivos de encabezado de Windows, cuyo máximo exponente es el famoso Windows.h, son ficheros de código fuente que contienen las declaraciones de todas las funciones, tipos de datos, macros y estructuras que componen la API de Windows. Al incluir uno de estos encabezados en nuestro proyecto (por ejemplo, con #include <Windows.h>), le estamos diciendo al compilador qué herramientas del sistema operativo están a nuestra disposición.

Estas declaraciones son esenciales para que el compilador entienda las llamadas a funciones del sistema. Sin ellas, intentar usar una función como CreateWindowEx resultaría en un error de compilación. Las principales ventajas que nos ofrecen son:

  • Acceso a la API nativa: Permiten invocar miles de funciones del sistema para gestionar ventanas, archivos, procesos, redes y mucho más.
  • Compatibilidad y Portabilidad: Están diseñados para facilitar la creación de aplicaciones de 32 y 64 bits a partir de una única base de código. Utilizan tipos de datos abstractos (como DWORD_PTR) que se adaptan a la arquitectura del sistema.
  • Soporte Unicode y ANSI: Incluyen declaraciones para ambas versiones de la API, permitiendo desarrollar aplicaciones que manejen distintos juegos de caracteres de forma nativa.
  • Comprobación de tipos estricta (STRICT Type Checking): Ayudan a prevenir errores comunes en tiempo de compilación al forzar un uso más riguroso de los tipos de datos, como el uso de manejadores (handles) específicos en lugar de tipos genéricos.

Headers, Visual C++ y el SDK de Windows: Una Convivencia Crucial

Es común que los desarrolladores utilicen Microsoft Visual C++ como su entorno de desarrollo. Este IDE incluye su propia copia de los headers de Windows, correspondiente a la versión del SDK que estaba vigente en el momento de su lanzamiento. Sin embargo, Microsoft actualiza el SDK de Windows de forma independiente, introduciendo nuevas funciones y APIs con cada nueva versión del sistema operativo.

Aquí surge un problema potencial: si instalas un SDK más reciente pero tu proyecto sigue utilizando los encabezados antiguos que venían con Visual Studio, te encontrarás con el temido error error C2065: identificador no declarado. Este error aparece cuando intentas usar una función que fue introducida después del lanzamiento de tu versión de Visual Studio. El compilador, al consultar los headers antiguos, simplemente no encuentra la declaración de dicha función.

La solución es asegurarse de que tu entorno de compilación esté configurado para utilizar la versión más reciente de los encabezados del SDK de Windows que tienes instalado, garantizando así el acceso a todas las funcionalidades más modernas.

El Poder de las Macros: Compilación Condicional para Múltiples Versiones

Una de las características más potentes y a la vez confusas de los headers de Windows es el uso de macros para la compilación condicional. Windows ha evolucionado a lo largo de décadas, y no todas las funciones de la API están disponibles en todas las versiones del sistema operativo. Para gestionar esto, los encabezados envuelven las declaraciones de funciones más nuevas en bloques condicionales.

Esto permite que, como desarrollador, puedas definir la versión mínima de Windows que tu aplicación soportará. El compilador usará esta información para incluir o excluir ciertas declaraciones. Si intentas usar una función no disponible en tu versión objetivo, el compilador te lo hará saber con un error, evitando así problemas en tiempo de ejecución para tus usuarios.

¿Cómo se definen las versiones objetivo?

Para especificar la versión mínima requerida, debes definir ciertas macros antes de incluir Windows.h. Las más importantes son WINVER y _WIN32_WINNT. Puedes hacerlo de dos maneras:

  1. Directamente en el código fuente: Usando la directiva #define al principio de tus archivos.
  2. #define _WIN32_WINNT 0x0A00 // Apuntar a Windows 10 #include <Windows.h>
  3. Mediante opciones del compilador: En Visual Studio, puedes añadirlo en las propiedades del proyecto, bajo C/C++ > Preprocessor > Preprocessor Definitions, o usando la opción de línea de comandos /D.

cl -c /D_WIN32_WINNT=0x0A00 source.cpp

A continuación, se presentan tablas con los valores más comunes para estas macros, que te servirán de guía para configurar tus proyectos.

Tabla de Macros de Versión de Windows (NTDDI_VERSION)

La macro NTDDI_VERSION es la forma preferida y más granular para especificar la versión. Si la defines, también debes definir _WIN32_WINNT.

What is a Windows header file?
The Windows header files use macros to indicate which versions of Windows support many programming elements. Therefore, you must define these macros to use new functionality introduced in each major operating system release.
Sistema Mínimo RequeridoValor para NTDDI_VERSION
Windows 10 (1903)NTDDI_WIN10_19H1 (0x0A000007)
Windows 10 (1809)NTDDI_WIN10_RS5 (0x0A000006)
Windows 8.1NTDDI_WINBLUE (0x06030000)
Windows 8NTDDI_WIN8 (0x06020000)
Windows 7NTDDI_WIN7 (0x06010000)
Windows VistaNTDDI_VISTA (0x06000000)
Windows XP SP3NTDDI_WINXPSP3 (0x05010300)

Tabla de Macros de Versión (_WIN32_WINNT y WINVER)

Sistema Mínimo RequeridoValor Mínimo para _WIN32_WINNT y WINVER
Windows 10_WIN32_WINNT_WIN10 (0x0A00)
Windows 8.1_WIN32_WINNT_WINBLUE (0x0603)
Windows 8_WIN32_WINNT_WIN8 (0x0602)
Windows 7_WIN32_WINNT_WIN7 (0x0601)
Windows Vista_WIN32_WINNT_VISTA (0x0600)
Windows XP_WIN32_WINNT_WINXP (0x0501)

Optimización y Buenas Prácticas

Más allá de la configuración de versiones, existen otras técnicas para optimizar el uso de los headers de Windows y mejorar tanto la eficiencia del código como los tiempos de compilación.

Control del Empaquetado de Estructuras

El alineamiento de datos en memoria es un concepto crítico para el rendimiento. Los headers de Windows asumen un empaquetado de estructuras (structure packing) por defecto de 8 bytes. Es vital que tus proyectos se compilen con esta misma configuración para asegurar que las estructuras de datos que pasas a la API de Windows tengan el mismo layout en memoria que el sistema operativo espera. Alterar esta configuración puede provocar fallos de alineamiento y errores muy difíciles de depurar. En Visual Studio, esta opción es /Zp8.

Acelerando la Compilación con Headers más Ligeros

El archivo Windows.h es masivo e incluye declaraciones para casi toda la API de Windows. En la mayoría de los proyectos, solo se necesita un pequeño subconjunto de estas APIs. Incluir todo el archivo puede ralentizar significativamente los tiempos de compilación. Para mitigar esto, puedes usar dos técnicas:

  1. Definir WIN32_LEAN_AND_MEAN: Esta es la macro más conocida para la optimización. Al definirla antes de incluir Windows.h, se excluyen APIs menos comunes como Cryptography, DDE, RPC, Shell y Windows Sockets.
  2. #define WIN32_LEAN_AND_MEAN #include <Windows.h>
  3. Usar macros NOapi: Para un control aún más fino, puedes excluir módulos específicos de la API. Por ejemplo, si no necesitas las APIs de comunicación en serie, puedes definir NOCOMM.
  4. #define NOCOMM #include <Windows.h>

    Una lista completa de los símbolos NOapi se puede encontrar dentro del propio archivo Windows.h.

    Preguntas Frecuentes (FAQ)

    ¿Qué es exactamente un archivo de encabezado de Windows?

    Es un archivo de código fuente (con extensión .h) que contiene las declaraciones de funciones, tipos de datos y macros que permiten a un programa en C/C++ interactuar con la Interfaz de Programación de Aplicaciones (API) del sistema operativo Windows.

    ¿Por qué recibo el error "C2065: identificador no declarado"?

    Generalmente, este error ocurre por dos razones: o tu proyecto está usando una versión desactualizada de los headers de Windows que no contiene la función que intentas usar, o no has definido las macros de versión (como _WIN32_WINNT) a un valor suficientemente alto para que la declaración de esa función sea incluida por el preprocesador.

    ¿Es obligatorio usar WIN32_LEAN_AND_MEAN?

    No, no es obligatorio. Sin embargo, es una práctica muy recomendada. Reduce drásticamente la cantidad de código que el preprocesador tiene que procesar, lo que resulta en tiempos de compilación más rápidos, especialmente en proyectos grandes. Solo debes evitarla si necesitas específicamente alguna de las APIs que excluye.

    ¿Cómo sé qué valor de macro de versión usar para mi proyecto?

    La regla general es elegir el valor correspondiente a la versión más antigua de Windows en la que quieres que tu aplicación se ejecute. Por ejemplo, si quieres que tu aplicación sea compatible con Windows 7 y versiones posteriores, deberías definir _WIN32_WINNT como 0x0601.

    Comprender y manejar correctamente los archivos de encabezado de Windows es una habilidad indispensable para cualquier desarrollador que trabaje en esta plataforma. No solo te permitirá evitar errores comunes, sino que también te dará el poder de crear aplicaciones más eficientes, compatibles y optimizadas, aprovechando al máximo todo lo que el sistema operativo tiene para ofrecer.

Si quieres conocer otros artículos parecidos a Guía Esencial de los Headers de Windows puedes visitar la categoría Juegos.

Subir