使用 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
相關主題