Windows API 集合
重要
本主題中的資訊適用於所有 Windows 10 版本及更新版本。 我們將在這裡將這些版本稱為「Windows」,並在必要時呼叫任何例外狀況。
所有版本的 Windows 都會共用稱為核心 OS 的作業系統 (OS) 元件通用基底(在某些情況下,此通用基底也稱為 OneCore)。 在核心OS元件中,Win32 API 會組織成稱為 API 集合的功能群組。
API 集合的目的是提供架構區隔與實作指定 Win32 API 的主機 DLL,以及 API 所屬的功能合約。 API 集合在實作和合約之間提供的分離為開發人員提供了許多工程優勢。 特別是,在您的程式代碼中使用 API 集合可以改善與 Windows 裝置的相容性。
API 集合會特別解決下列案例:
雖然計算機支援 Win32 API 的完整廣度,但只有 Win32 API 的子集可用於其他 Windows 裝置,例如 HoloLens、Xbox 和其他裝置。 API 集合名稱會提供查詢機制,以清楚偵測 API 是否可在任何指定的裝置上使用。
某些 Win32 API 實作存在於具有不同 Windows 裝置不同名稱的 DLL 中。 在偵測 API 可用性和延遲載入 API 時,使用 API 集合名稱,而不是 DLL 名稱,無論實際實作 API 的位置為何,都會提供正確的路由至實作。
如需詳細資訊,請參閱 API 集合載入器作業 和 偵測 API 集合可用性。
API 集合和 dll 是否相同?
否—API 集合名稱是實體.dll
檔案的虛擬別名。 這是實作隱藏技術,您身為呼叫者不需要確切地知道裝載資訊哪一個模組。
這項技術可讓模組在不同的 Windows 版本和版本上重構(分割、合併、重新命名等等)。 您的應用程式仍會連結,且仍會在運行時間路由傳送至正確的程序代碼。
那麼,為什麼 API 集合的名稱中有 .dll
? 原因是 DLL 載入器實作的方式。 載入器是載入 DLL 和/或解析 DLL 參考之 OS 的一部分。 在前端,載入器會要求傳遞至 LoadLibrary 的任何字串都必須以 「.dll」 終止。 但在該前端之後,載入器可以去除該後綴,並使用產生的字串查詢 API 集合資料庫。
LoadLibrary (和延遲載入)會以 API 集合名稱成功(其中含有 “.dll”;但計算機上任何位置都沒有該名稱的實際檔案。
連結傘連結庫
為了更輕鬆地將程式代碼限制為核心OS中支援的Win32 API,我們提供一系列的 傘式連結庫。 例如,名為 OneCore.lib
的傘式連結庫會針對所有 Windows 裝置通用的 Win32 API 子集提供導出。
如需詳細資訊,請參閱 Windows 雨傘連結庫。
API 集合合約名稱
API 集合是由強式合約名稱來識別,其遵循連結庫載入器所辨識的標準慣例。
- 名稱必須以字串 api- 或 ext-開頭。
- 以 api 開頭的名稱, 代表存在於滿足 API 版本需求的所有 Windows 版本上的 API。
- 以 ext- 開頭的名稱表示可能不存在於所有 Windows 版本上的 API。
- 名稱結尾必須是序列 l n-n-n<>>><,其中 n 是由十進位數所組成。<
- 名稱的主體可以是英數位元或虛線 (-)。
- 名稱不區分大小寫。
以下是 API 集合合約名稱的一些範例:
- api-ms-win-core-ums-l1-1-0
- ext-ms-win-com-ole32-l1-1-5
- ext-ms-win-ntuser-window-l1-1-0
- ext-ms-win-ntuser-window-l1-1-1
您可以在載入器作業的內容中使用 API 集合名稱,例如 LoadLibrary 或 P/Invoke ,而不是 DLL 模組名稱,以確保無論 API 實際在目前裝置上實作的位置,都能正確路由傳送至實作。 不過,當您這樣做時,您必須在合約名稱結尾附加字串 .dll 。 這是載入器正常運作的需求,而且實際上不會被視為合約名稱的一部分。 雖然合約名稱與此內容中的 DLL 名稱類似,但它們與 DLL 模組名稱基本不同,而且不會直接參考磁碟上的檔案。
除了在載入器作業中附加字串 .dll 之外,API 集合合約名稱應該視為對應至特定合約版本的不可變標識符。
識別 Win32 API 的 API 集合
若要識別特定 Win32 API 是否屬於 API 集合,請檢閱 API 參考檔中的需求數據表。 如果 API 屬於 API 集合,文章中的需求數據表會列出 API 集合名稱和 API 第一次引入 API 集合的 Windows 版本。 如需屬於 API 集合的 API 範例,請參閱下列文章: