Usando os cabeçalhos do Windows

Os arquivos de cabeçalho para a API do Windows permitem que você crie aplicativos de 32 e 64 bits. Elas incluem declarações para as versões Unicode e ANSI da API. Para obter mais informações, consulte Unicode na API do Windows. Eles usam tipos de dados que permitem criar versões de 32 e 64 bits do aplicativo de uma única base de código-fonte. Para obter mais informações, consulte Preparando-se para o Windows de 64 bits. Os recursos adicionais incluem Anotações de Cabeçalho e Verificação de Tipo STRICT.

Visual C++ e os Arquivos de Cabeçalho do Windows

Microsoft Visual C++ inclui cópias dos arquivos de cabeçalho do Windows que estavam atuais no momento em que o Visual C++ foi lançado. Portanto, se você instalar arquivos de cabeçalho atualizados de um SDK, poderá acabar com várias versões dos arquivos de cabeçalho do Windows em seu computador. Se você não garantir que está usando a versão mais recente dos arquivos de cabeçalho do SDK, receberá o seguinte código de erro ao compilar o código que usa recursos que foram introduzidos depois que o Visual C++ foi lançado: erro C2065: identificador não declarado.

Macros para declarações condicionais

Determinadas funções que dependem de uma versão específica do Windows são declaradas usando código condicional. Isso permite que você use o compilador para detectar se seu aplicativo usa funções que não têm suporte em suas versões de destino do Windows. Para compilar um aplicativo que usa essas funções, você deve definir as macros apropriadas. Caso contrário, você receberá a mensagem de erro C2065.

Os arquivos de cabeçalho do Windows usam macros para indicar quais versões do Windows dão suporte a muitos elementos de programação. Portanto, você deve definir essas macros para usar a nova funcionalidade introduzida em cada versão principal do sistema operacional. (Arquivos de cabeçalho individuais podem usar macros diferentes; portanto, se ocorrerem problemas de compilação, marcar o arquivo de cabeçalho que contém a definição para definições condicionais.) Para obter mais informações, consulte SdkDdkVer.h.

A tabela a seguir descreve as macros preferenciais usadas nos arquivos de cabeçalho do Windows. Se você definir NTDDI_VERSION, também deverá definir _WIN32_WINNT.

Sistema mínimo necessário Valor para NTDDI_VERSION
Windows 10 1903 "19H1" NTDDI_WIN10_19H1 (0x0A000007)
Windows 10 1809 "Redstone 5" NTDDI_WIN10_RS5 (0x0A000006)
Windows 10 1803 "Redstone 4" NTDDI_WIN10_RS4 (0x0A000005)
Windows 10 1709 "Redstone 3" NTDDI_WIN10_RS3 (0x0A000004)
Windows 10 1703 "Redstone 2" NTDDI_WIN10_RS2 (0x0A000003)
Windows 10 1607 "Redstone 1" NTDDI_WIN10_RS1 (0x0A000002)
Windows 10 1511 "Limite 2" NTDDI_WIN10_TH2 (0x0A000001)
Windows 10 "Limite" 1507 NTDDI_WIN10 (0x0A000000)
Windows 8.1 NTDDI_WINBLUE (0x06030000)
Windows 8 NTDDI_WIN8 (0x06020000)
Windows 7 NTDDI_WIN7 (0x06010000)
Windows Server 2008 NTDDI_WS08 (0x06000100)
Windows Vista com Service Pack 1 (SP1) NTDDI_VISTASP1 (0x06000100)
Windows Vista NTDDI_VISTA (0x06000000)
Windows Server 2003 com Service Pack 2 (SP2) NTDDI_WS03SP2 (0x05020200)
Windows Server 2003 com Service Pack 1 (SP1) NTDDI_WS03SP1 (0x05020100)
Windows Server 2003 NTDDI_WS03 (0x05020000)
Windows XP com Service Pack 3 (SP3) NTDDI_WINXPSP3 (0x05010300)
Windows XP com Service Pack 2 (SP2) NTDDI_WINXPSP2 (0x05010200)
Windows XP com SP1 (Service Pack 1) NTDDI_WINXPSP1 (0x05010100)
Windows XP NTDDI_WINXP (0x05010000)

 

As tabelas a seguir descrevem outras macros usadas nos arquivos de cabeçalho do Windows.

Sistema mínimo necessário Valor mínimo para _WIN32_WINNT e 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 Server 2008 _WIN32_WINNT_WS08 (0x0600)
Windows Vista _WIN32_WINNT_VISTA (0x0600)
Windows Server 2003 com SP1, Windows XP com SP2 _WIN32_WINNT_WS03 (0x0502)
Windows Server 2003, Windows XP _WIN32_WINNT_WINXP (0x0501)

 

Versão mínima necessária Valor mínimo de _WIN32_IE
Internet Explorer 11.0 _WIN32_IE_IE110 (0x0A00)
Internet Explorer 10.0 _WIN32_IE_IE100 (0x0A00)
Internet Explorer 9.0 _WIN32_IE_IE90 (0x0900)
Internet Explorer 8.0 _WIN32_IE_IE80 (0x0800)
Internet Explorer 7.0 _WIN32_IE_IE70 (0x0700)
Internet Explorer 6.0 SP2 _WIN32_IE_IE60SP2 (0x0603)
Internet Explorer 6.0 SP1 _WIN32_IE_IE60SP1 (0x0601)
Internet Explorer 6.0 _WIN32_IE_IE60 (0x0600)
Internet Explorer 5,5 _WIN32_IE_IE55 (0x0550)
Internet Explorer 5.01 _WIN32_IE_IE501 (0x0501)
Internet Explorer 5.0, 5.0a, 5.0b _WIN32_IE_IE50 (0x0500)

 

Definindo WINVER ou _WIN32_WINNT

Você pode definir esses símbolos usando a instrução #define em cada arquivo de origem ou especificando a opção do compilador /D compatível com o Visual C++.

Por exemplo, para definir WINVER no arquivo de origem, use a seguinte instrução:

#define WINVER 0x0502

Para definir _WIN32_WINNT no arquivo de origem, use a seguinte instrução:

#define _WIN32_WINNT 0x0502

Para definir _WIN32_WINNT usando a opção do compilador /D, use o seguinte comando:

cl -c /D_WIN32_WINNT=0x0502source.cpp

Para obter informações sobre como usar a opção do compilador /D, consulte /D (definições de pré-processador).

Observe que alguns recursos introduzidos na versão mais recente do Windows podem ser adicionados a um service pack para uma versão anterior do Windows. Portanto, para direcionar um service pack, talvez seja necessário definir _WIN32_WINNT com o valor para a próxima versão principal do sistema operacional. Por exemplo, a função GetDllDirectory foi introduzida no Windows Server 2003 e é definida condicionalmente se _WIN32_WINNT é 0x0502 ou superior. Essa função também foi adicionada ao Windows XP com SP1. Portanto, se você definisse _WIN32_WINNT como 0x0501 para direcionar o Windows XP, perderia os recursos definidos no Windows XP com SP1.

Controlando o empacotamento de estrutura

Os projetos devem ser compilados para usar o empacotamento de estrutura padrão, que atualmente é de 8 bytes porque o maior tipo integral é de 8 bytes. Isso garante que todos os tipos de estrutura dentro dos arquivos de cabeçalho sejam compilados no aplicativo com o mesmo alinhamento que a API do Windows espera. Ele também garante que as estruturas com valores de 8 bytes estejam corretamente alinhadas e não causarão falhas de alinhamento em processadores que impõem o alinhamento de dados.

Para obter mais informações, consulte /Zp (alinhamento de membro struct) ou pacote.

Compilações mais rápidas com arquivos de cabeçalho menores

Você pode reduzir o tamanho dos arquivos de cabeçalho do Windows excluindo algumas das declarações de API menos comuns da seguinte maneira:

  • Defina WIN32_LEAN_AND_MEAN para excluir APIs como Criptografia, DDE, RPC, Shell e Soquetes do Windows.

    #define WIN32_LEAN_AND_MEAN

  • Defina um ou mais dos símbolos deAPI NO para excluir a API. Por exemplo, NOCOMM exclui a API de comunicação serial. Para obter uma lista de símbolos deAPI SEM suporte, consulte Windows.h.

    #define NOCOMM

Site de download do SDK do Windows