Windows API 集

重要

本主题中的信息适用于所有版本的Windows 10和Windows 11。 我们将此处的这些版本称为“Windows”,并在必要时调用任何异常。

所有版本的Windows共享称为核心 OS (的 OS 组件,在某些上下文中,此通用基础也称为OneCore) 。 在核心 OS 组件中,Win32 API 组织成称为 API 集的功能组。

API 集的目的是提供与实现给定 Win32 API 的主机 DLL 和 API 所属的功能协定的体系结构分离。 API 集在实现和合同之间提供的分离为开发人员提供了许多工程优势。 具体而言,在代码中使用 API 集可以提高与 Windows 设备的兼容性。

API 集专门解决了以下方案:

  • 尽管电脑支持 Win32 API 的完整广度,但其他Windows 10和/或Windows 11设备(如 HoloLens、Xbox 和其他设备)仅提供了 Win32 API 的子集。 API 集名称提供一种查询机制,用于干净检测 API 是否在任何给定设备上可用。

  • 某些 Win32 API 实现存在于具有不同Windows设备的不同名称的 DLL 中。 检测 API 可用性和延迟加载 API 时,使用 API 集名称而不是 DLL 名称,无论实际实现 API 的位置如何,都提供正确的路由到实现。

有关详细信息,请参阅 API 集加载程序操作检测 API 集可用性

链接到伞式库

为了更轻松地将代码限制为核心 OS 中支持的 Win32 API,我们提供了一系列 伞式库。 例如,名为的OneCore.lib伞式库为所有Windows设备通用的 Win32 API 子集提供导出。

可以在一系列模块中实现伞式库中的 API。 伞式库将这些详细信息从你身边抽象开来,使代码在Windows版本和设备之间更易于移植。 无需链接到 kernel32.lib 和 advapi32.lib 等库,只需将桌面应用或驱动程序链接到包含你感兴趣的核心 OS API 集的伞式库。

有关详细信息,请参阅Windows伞库

API 集协定名称

API 集由强协定名称标识,该名称遵循库加载程序识别的这些标准约定。

  • 名称必须以字符串 apiext-开头。
    • 以 api 开头的名称表示保证存在于所有Windows版本上的 API。
    • ext- 表示 API 开头的名称,这些 API 可能不存在于所有Windows版本。
  • 名称必须以序列 ln-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

可以在加载程序操作(如 LoadLibraryP/Invoke )的上下文中使用 API 集名称,而不是 DLL 模块名称,以确保在当前设备上实际实现 API 的位置正确路由到实现。 但是,执行此操作时,必须在协定名称末尾追加字符串 .dll 。 这是加载程序正常运行的要求,实际上不被视为协定名称的一部分。 尽管协定名称与此上下文中的 DLL 名称类似,但它们与 DLL 模块名称基本不同,但不直接引用磁盘上的文件。

除了在加载程序操作中追加字符串 .dll 外,API 设置协定名称应被视为与特定协定版本对应的不可变标识符。

标识 Win32 API 的 API 集

若要确定特定 Win32 API 是否属于 API 集,请查看 API 参考文档中的要求表。 如果 API 属于 API 集,则文章中的要求表列出了 API 集名称和首次将 API 引入到 API 集的Windows版本。 有关属于 API 集的 API 示例,请参阅以下文章:

在本节中