使用 Windows 標頭

Windows API 的標頭檔可讓您建立 32 位和 64 位應用程式。 它們包含 Unicode 和 ANSI 版 API 的宣告。 如需詳細資訊,請參閱 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 (含 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=0x0502source.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 下載網站