Uso delle intestazioni di Windows

I file di intestazione per l'API Windows consentono di creare applicazioni a 32 e a 64 bit. Includono dichiarazioni per le versioni Unicode e ANSI dell'API. Per altre informazioni, vedere Unicode nell'API Windows. Usano tipi di dati che consentono di creare versioni a 32 e a 64 bit dell'applicazione da una singola base di codice sorgente. Per altre informazioni, vedere Preparazione per Windows a 64 bit. Altre funzionalità includono annotazioni di intestazione e controllo dei tipi STRICT.

Visual C++ e i file di intestazione di Windows

Microsoft Visual C++ include copie dei file di intestazione di Windows correnti al momento in cui Visual C++ è stato rilasciato. Pertanto, se si installano file di intestazione aggiornati da un SDK, è possibile che vengano visualizzate più versioni dei file di intestazione di Windows nel computer. Se non si assicura di usare la versione più recente dei file di intestazione SDK, si riceverà il codice di errore seguente durante la compilazione del codice che usa le funzionalità introdotte dopo che Visual C++ è stato rilasciato: errore C2065: identificatore non dichiarato.

Macro per dichiarazioni condizionali

Alcune funzioni che dipendono da una determinata versione di Windows vengono dichiarate usando il codice condizionale. Ciò consente di usare il compilatore per rilevare se l'applicazione usa funzioni non supportate nelle versioni di destinazione di Windows. Per compilare un'applicazione che usa queste funzioni, è necessario definire le macro appropriate. In caso contrario, verrà visualizzato il messaggio di errore C2065.

I file di intestazione di Windows usano macro per indicare quali versioni di Windows supportano molti elementi di programmazione. Pertanto, è necessario definire queste macro per usare nuove funzionalità introdotte in ogni versione principale del sistema operativo. I singoli file di intestazione possono usare macro diverse, pertanto, se si verificano problemi di compilazione, controllare il file di intestazione contenente la definizione per le definizioni condizionali. Per altre informazioni, vedere SdkDdkVer.h.

Nella tabella seguente vengono descritte le macro preferite usate nei file di intestazione di Windows. Se si definisce NTDDI_VERSION, è necessario definire anche _WIN32_WINNT.

Sistema minimo richiesto Valore per 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 "Soglia 2" NTDDI_WIN10_TH2 (0x0A000001 )
Windows 10 1507 "Soglia" 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 con Service Pack 1 (SP1) NTDDI_VISTASP1 (0x06000100 )
Windows Vista NTDDI_VISTA (0x06000000 )
Windows Server 2003 con Service Pack 2 (SP2) NTDDI_WS03SP2 (0x05020200 )
Windows Server 2003 con Service Pack 1 (SP1) NTDDI_WS03SP1 (0x05020100 )
Windows Server 2003 NTDDI_WS03 (0x05020000 )
Windows XP con Service Pack 3 (SP3) NTDDI_WINXPSP3 (0x05010300 )
Windows XP con Service Pack 2 (SP2) NTDDI_WINXPSP2 (0x05010200 )
Windows XP con Service Pack 1 (SP1) NTDDI_WINXPSP1 (0x05010100 )
Windows XP NTDDI_WINXP (0x05010000 )

 

Le tabelle seguenti descrivono altre macro usate nei file di intestazione di Windows.

Sistema minimo richiesto Valore minimo per _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 con SP1, Windows XP con SP2 _WIN32_WINNT_WS03 (0x0502 )
Windows Server 2003, Windows XP _WIN32_WINNT_WINXP (0x0501 )

 

Versione minima richiesta Valore minimo di _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 )

 

Impostazione di WINVER o _WIN32_WINNT

È possibile definire questi simboli usando l'istruzione #define in ogni file di origine o specificando l'opzione del compilatore /D supportata da Visual C++.

Ad esempio, per impostare WINVER nel file di origine, usare l'istruzione seguente:

#define WINVER 0x0502

Per impostare _WIN32_WINNT nel file di origine, usare l'istruzione seguente:

#define _WIN32_WINNT 0x0502

Per impostare _WIN32_WINNT usando l'opzione del compilatore /D, usare il comando seguente:

cl -c /D_WIN32_WINNT=0x0502source.cpp

Per informazioni sull'uso dell'opzione del compilatore /D, vedere /D (definizioni di preprocessore).

Si noti che alcune funzionalità introdotte nella versione più recente di Windows possono essere aggiunte a un Service Pack per una versione precedente di Windows. Pertanto, per indirizzare un Service Pack, potrebbe essere necessario definire _WIN32_WINNT con il valore per la versione principale del sistema operativo successivo. Ad esempio, la funzione GetDllDirectory è stata introdotta in Windows Server 2003 ed è definita in modo condizionale se _WIN32_WINNT è 0x0502 o successiva. Questa funzione è stata aggiunta anche a Windows XP con SP1. Pertanto, se si intende definire _WIN32_WINNT come 0x0501 di destinazione Windows XP, si perderebbero le funzionalità definite in Windows XP con SP1.

Controllo dell'imballaggio della struttura

I progetti devono essere compilati per usare il pacchetto predefinito della struttura, che è attualmente 8 byte perché il tipo integrale più grande è di 8 byte. Ciò garantisce che tutti i tipi di struttura all'interno dei file di intestazione vengano compilati nell'applicazione con lo stesso allineamento previsto dall'API Di Windows. Garantisce inoltre che le strutture con valori a 8 byte siano allineate correttamente e non causeranno errori di allineamento sui processori che applicano l'allineamento dei dati.

Per altre informazioni, vedere /Zp (allineamento membro struct) o pack.

Build più veloci con file di intestazione più piccoli

È possibile ridurre le dimensioni dei file di intestazione di Windows escludendo alcune delle dichiarazioni API meno comuni come indicato di seguito:

  • Definire WIN32_LEAN_AND_MEAN per escludere API, ad esempio Crittografia, DDE, RPC, Shell e Windows Sockets.

    #define WIN32_LEAN_AND_MEAN

  • Definire uno o più simboli diAPI NO per escludere l'API. Ad esempio, NOCOMM esclude l'API di comunicazione seriale. Per un elencodi simboli api NO di supporto, vedere Windows.h.

    #define NOCOMM

Sito di download di Windows SDK