Windows API セット

重要

このトピックの情報は、Windows 10 以降のすべてのバージョンに適用されます。 ここでは、これらのバージョンを Windows と呼び、必要に応じて例外を呼び出します。

すべてのバージョンの Windows は、コア OS と呼ばれるオペレーティング システム (OS) コンポーネントの共通ベースを共有します (一部のコンテキストでは、この共通ベースは OneCore とも呼ばれます)。 コア OS コンポーネントでは、Win32 API は API セットと呼ばれる機能グループに編成されます。

API セットの目的は、特定の Win32 API が実装されているホスト DLL と、API が属する機能コントラクトからアーキテクチャを分離することです。 API セットが実装とコントラクトの間で提供する分離は、開発者にとって多くのエンジニアリング上の利点となります。 特に、コードで API セットを使用すると、Windows デバイスとの互換性が向上します。

具体的には、API セットは以下のシナリオを扱います。

  • Win32 API の全幅は PC でサポートされていますが、HoloLens、Xbox、その他のデバイスなどの他の Windows デバイスでは、Win32 API のサブセットのみが使用できます。 API セット名は、特定のデバイスで API が使用可能かどうかをクリーンに検出するためのクエリ メカニズムを提供します。

  • 一部の Win32 API 実装は、異なる Windows デバイス間で異なる名前を持つ DLL に存在します。 API の可用性と遅延読み込み API を検出するときに DLL 名の代わりに API セット名を使用すると、API が実際に実装されている場所に関係なく、実装への正しいルートが提供されます。

詳細については、API セット ローダー操作API セットの可用性の検出に関するページを参照してください。

API セットと dll は同じでしょうか。

いいえ—API セット名は、物理.dllファイルの仮想エイリアスです。 これは実装を隠す手法で、呼び出し元は、どのモジュールが情報をホストしているのかを正確に知る必要はありません。

この手法を使用すると、異なる Windows バージョンやエディションでモジュールをリファクタリング (分割、統合、名前変更など) できます。 アプリは引き続きリンクされ、実行時に正しいコードにルーティングされます。

では、API セットが名前に.dllが含まれるのか。 その理由は、DLL ローダーの実装方法です。 ローダーは、DLLを読み込んだり、DLLへのリファレンスを解決したりする OS の一部です。 また、フロント エンドでは、LoadLibrary に渡されるすべての文字列を ".dll" で終了する必要があります。 ただし、そのフロントエンドの後、ローダーはそのサフィックスを取り除き、結果の文字列を使用して API セット データベースにクエリを実行できます。

LoadLibrary (および遅延読み込み) は API セット名 (".dll" が含まれる) で成功しますが、PC 上のどこにもその名前の実際のファイルが存在するとは限りません。

アンブレラ ライブラリのリンク

コア OS でサポートされている Win32 API にコードを簡単に制限できるように、一連の アンブレラ ライブラリが用意されています。 たとえば、OneCore.lib という名前のアンブレラ ライブラリは、すべての Windows デバイスに共通する Win32 API のサブセットのエクスポートを提供します。

詳細については、Windows アンブレラ ライブラリに関するページを参照してください。

API セット のコントラクト名

API セットは、ライブラリ ローダーによって認識されるこれらの標準規則に従う厳密なコントラクト名によって識別されます。

  • 名前は、文字列 api または ext で始まる必要があります。
    • api で始まる名前は、すべての Windows バージョンに存在することが保証されている API を表します。
    • ext で始まる名前は、すべての Windows バージョンに存在しない API を表します。
  • 名前は l<n>-<n>-<n> というシーケンスで終わる必要があり、n は 10 進数で構成されます。
  • 名前の本文には、英数字またはダッシュ (-) を指定できます。
  • 名前の大文字と小文字は区別されます。

次に、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 セットに最初に導入された Windows バージョンが一覧表示されます。 API セットに属する API の例については、次の記事を参照してください。

このセクションの内容