使用 Windows 標頭

Windows API 的頭檔可讓您建立 32 位和 64 位應用程式。 它們包含 API Unicode 和 ANSI 版本的宣告。 如需詳細資訊,請參閱 Windows API 中的 Unicode。 它們會使用 數據類型 ,讓您從單一原始程式碼基底建置 32 位和 64 位版本的應用程式。 如需詳細資訊,請參閱 準備 64 位 Windows。 其他功能包括 標頭批註STRICT 類型檢查

Visual C++ 和 Windows 頭檔

Microsoft Visual C++包含發行 Visual C++時目前 Windows 頭文件複本。 因此,如果您從 SDK 安裝更新的頭檔,您最終可能會在電腦上安裝多個版本的 Windows 頭檔。 如果您不確定您使用的是最新版本的 SDK 頭文件,當您編譯使用 Visual C++ 發行後所引進功能的程式代碼時,您會收到下列錯誤碼:錯誤 C2065:未宣告的標識符。

條件式宣告的宏

相依於特定 Windows 版本的特定函式會使用條件式程式碼來宣告。 這可讓您使用編譯程式來偵測應用程式是否使用 Windows 目標版本不支援的函式。 若要編譯使用這些函式的應用程式,您必須定義適當的宏。 否則,您會收到 C2065 錯誤訊息。

Windows 頭檔使用宏來指出哪些 Windows 版本支援許多程式設計元素。 因此,您必須定義這些宏,才能使用每個主要操作系統版本中引進的新功能。 (個別頭檔可能會使用不同的宏;因此,如果發生編譯問題,請檢查包含條件式定義的頭檔。如需詳細資訊,請參閱 SdkDdkVer.h。

下表描述 Windows 頭檔中使用的慣用宏。 如果您定義NTDDI_VERSION,也必須定義_WIN32_WINNT。

所需的最低系統 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「閾值 2」 NTDDI_WIN10_TH2 (0x0A000001)
Windows 10 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 包含 Service Pack 1 (SP1) NTDDI_VISTASP1 (0x06000100)
Windows Vista NTDDI_VISTA (0x06000000)
Windows Server 2003 Service Pack 2 (SP2) NTDDI_WS03SP2 (0x05020200)
Windows Server 2003 含 Service Pack 1 (SP1) NTDDI_WS03SP1 (0x05020100)
Windows Server 2003 NTDDI_WS03 (0x05020000)
Windows XP with Service Pack 3 (SP3) NTDDI_WINXPSP3 (0x05010300)
Windows XP with Service Pack 2 (SP2) NTDDI_WINXPSP2 (0x05010200)
Windows XP with Service Pack 1 (SP1) NTDDI_WINXPSP1 (0x05010100)
Windows XP NTDDI_WINXP (0x05010000)

 

下表描述 Windows 頭檔中使用的其他宏。

所需的最低系統 _WIN32_WINNT 和 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 SP1、Windows XP with SP2 _WIN32_WINNT_WS03 (0x0502)
Windows Server 2003、Windows XP _WIN32_WINNT_WINXP (0x0501)

 

需要的最小版本 _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)

 

設定 WINVER 或 _WIN32_WINNT

您可以使用每個來源檔案中的 #define 語句,或指定Visual C++支援的 /D 編譯程式選項,來定義這些符號。

例如,若要在原始程式檔中設定WINVER,請使用下列語句:

#define WINVER 0x0502

若要在原始程式檔中設定_WIN32_WINNT,請使用下列語句:

#define _WIN32_WINNT 0x0502

若要使用 /D 編譯程式選項設定_WIN32_WINNT,請使用下列命令:

cl -c /D_WIN32_WINNT=0x0502 source.cpp

如需使用 /D 編譯程式選項的詳細資訊,請參閱 /D (預處理器定義)

請注意,最新版本 Windows 中引進的某些功能可能會新增至舊版 Windows 的 Service Pack。 因此,若要以 Service Pack 為目標,您可能需要使用下一個主要作業系統版本的值來定義_WIN32_WINNT。 例如, GetDllDirectory 函式是在 Windows Server 2003 中引進的,而且會在_WIN32_WINNT 0x0502或更新時有條件地定義。 此函式也已新增至 Windows XP 與 SP1。 因此,如果您要將_WIN32_WINNT定義為以 Windows XP 為目標的0x0501,您會遺漏 Windows XP 中 SP1 中定義的功能。

控制結構封裝

項目應該編譯成使用預設結構封裝,目前為8個字節,因為最大的整數類型是8個字節。 如此可確保頭檔內的所有結構類型都會編譯成與 Windows API 預期的相同對齊方式的應用程式。 它也可確保具有8位元組值的結構會正確對齊,而且不會在強制執行數據對齊的處理器上造成對齊錯誤。

如需詳細資訊,請參閱 /Zp(結構成員對齊)套件

使用較小的頭檔更快速建置

您可以排除一些較不常見的 API 宣告,以減少 Windows 頭檔的大小,如下所示:

  • 定義WIN32_LEAN_AND_MEAN以排除 API,例如密碼編譯、DDE、RPC、殼層和 Windows 套接字。

    #define WIN32_LEAN_AND_MEAN

  • 定義一或多個 NOAPI 符號以排除 API。 例如,NOCOMM 會排除序列通訊 API。 如需支援 NOAPI 符號的清單,請參閱 Windows.h。

    #define NOCOMM

Windows SDK 下載網站