Поделиться через


Наборы API Windows

Внимание

Сведения в этом разделе относятся ко всем версиям Windows 10 и более поздним версиям. Здесь мы будем ссылаться на эти версии как "Windows", вызывая все исключения при необходимости.

Все версии Windows используют общую базу компонентов операционной системы (ОС), которые называют основной ОС (в некоторых контекстах эта общая база также называется OneCore). В основных компонентах ОС API Win32 организованы в функциональные группы, называемые наборами API.

Назначение набора API заключается в предоставлении архитектурного разделения от библиотеки DLL узла, в которой реализован заданный API Win32, а также функциональный контракт, к которому принадлежит API. Разделение наборов API, предоставляемых между реализацией и контрактами, предлагает множество инженерных преимуществ для разработчиков. В частности, использование наборов API в коде может улучшить совместимость с устройствами Windows.

Наборы API специально относятся к следующим сценариям:

  • Хотя на компьютерах поддерживается полный набор API Win32, на других устройствах Windows доступно только подмножество API Win32, например HoloLens, Xbox и других устройств. Имя набора API предоставляет механизм запроса для четкого определения доступности API на любом устройстве.

  • Некоторые реализации API Win32 существуют в библиотеках DLL с разными именами на разных устройствах Windows. Использование имен наборов API вместо имен БИБЛИОТЕК DLL при обнаружении доступности API и задержке загрузки API обеспечивает правильный маршрут реализации независимо от того, где фактически реализован API.

Дополнительные сведения см. в статье об операции загрузчика набора API и обнаружении доступности набора API.

Совпадают ли наборы API и библиотеки DLL?

Нет. Имя набора API — это виртуальный псевдоним физического .dll файла. Это метод скрытия реализации, где вы, как вызывающий объект, не должны точно знать, какой модуль размещает информацию.

Этот метод позволяет рефакторингу модулей (разделить друг от друга, объединить, переименовать и т. д.) в разных версиях и выпусках Windows. И ваши приложения по-прежнему ссылаются и по-прежнему направляются к правильному коду во время выполнения.

Так почему наборы API имеют .dll в именах? Причина заключается в том, как реализуется загрузчик DLL. Загрузчик является частью ОС, которая загружает библиотеки DLL и /или разрешает ссылки на библиотеки DLL. А в интерфейсном интерфейсе загрузчику требуется, чтобы любая строка, переданная в LoadLibrary , была завершена с ".dll". Но после этого внешнего интерфейса загрузчик может удалить этот суффикс и запросить базу данных набора API с результирующей строкой.

LoadLibrary (и задержка загрузки) успешно выполняется с именем набора API (с именем .dll в нем); но не обязательно фактический файл с таким именем в любом месте компьютера.

Связывание зонтичных библиотек

Чтобы упростить ограничение кода на API Win32, поддерживаемые в основной ОС, мы предоставляем ряд зонтичных библиотек. Например, зонтичная библиотека с именем OneCore.lib предоставляет экспорт для подмножества API Win32, которые являются общими для всех устройств Windows.

Дополнительные сведения см . в библиотеках зонтиков Windows.

Имена контрактов набора API

Наборы API определяются строгим именем контракта, который следует этим стандартным соглашениям, распознаваемым загрузчиком библиотеки.

  • Имя должно начинаться с строкового API или ext-.
    • Имена, начинающиеся с API-представления API, которые существуют во всех выпусках Windows, удовлетворяющих требованиям версии API.
    • Имена, начинающиеся с ext- представляют API, которые могут не существовать во всех выпусках Windows.
  • Имя должно заканчиваться последовательностью 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 задают неизменяемый идентификатор, соответствующий определенной версии контракта.

Определение наборов API для API Win32

Чтобы определить, принадлежит ли определенный API Win32 набору API, просмотрите таблицу требований в справочной документации по API. Если API принадлежит набору API, таблица требований в статье содержит имя набора API и версию Windows, в которой API впервые появился в наборе API. Примеры API, принадлежащие набору API, см. в следующих статьях:

В этом разделе