Windows API

Windows APIとは



Windows API(ウィンドウズ エーピーアイ)は、Microsoft Windowsオペレーティングシステムの中核をなすシステムコール用APIです。特に、32ビットプロセッサ向けに設計されたWin32 APIは、Windows 95以降のバージョンで広く利用され、Windowsの機能にアクセスするための重要なインターフェースとなっています。64ビットプロセッサ向けのWin64 APIを含める場合は「Windows API」という包括的な名称が用いられますが、実際にはWin32という言葉がWin64を含む意味で使われることもあります。

Windows APIの概要



Windows APIは、Windows OS上で動作するアプリケーションが、OSの各種機能を利用するための接点です。C、C++をはじめとする様々なプログラミング言語や開発環境で、Windows APIを利用するための手段が提供されています。特にC/C++向けには、Windows SDKを通じて、`windows.h` などのヘッダーファイルが提供されており、OSの機能にアクセスする部分は、内部でWindows APIを用いて実装されています。多くの開発環境では、Windows APIを基盤とした高レベルのフレームワークが構築されており、全てのWindowsアプリケーションは、直接的または間接的にWindows APIを使用しています。

APIは主にDLLに実装され、C言語形式の関数またはCOMインターフェースとして公開されています。関数の呼び出し規約は、Win32 (x86) の場合、原則としてstdcallが採用されるなど、統一されたインターフェースにより多数のプログラミング言語からの利用を容易にしています。

Windows APIの分類



Windows APIの中核をなす機能は、Kernel、User、GDIの3つに分類されます。

Kernel



Kernelは、ファイルシステムデバイスプロセス、スレッド、レジストリ、例外処理など、OSの基盤となる機能を提供します。初期のWindowsでは、`KERNEL.EXE`に実装されていましたが、32ビット化以降は `KERNEL32.DLL` に実装されています。

User



Userは、ウィンドウの処理、ボタンやスクロールバーなどの基本的なコントロール、マウス・キーボード入力など、グラフィカルユーザーインターフェース(GUI)に関わる機能を提供します。初期のWindowsでは `USER.EXE` に実装されていましたが、32ビット化以降は `USER32.DLL` に実装されています。

GDI



GDIは、ディスプレイやプリンターなどの出力装置への描画機能を提供します。初期のWindowsでは `GDI.EXE` に実装されていましたが、32ビット化以降は `GDI32.DLL` に実装されています。

現在では、これらの分類に留まらず、多数のDLLから無数の機能が公開されており、Microsoftのドキュメントでは、Administration and Management、Diagnostics、Graphics and Multimedia、Networking、Security、System Services、Windows User Interfaceといったカテゴリに分類しています。

グラフィックとマルチメディア



Windows APIにおけるグラフィックとマルチメディア関連のAPIは、DirectXが中心的な役割を担っています。DirectXは、主にゲームやマルチメディア処理のために開発されましたが、Windows Vista以降はOSのグラフィックス描画基盤としても利用されています。

DirectX



DirectXには、3Dグラフィックスを扱うDirect3D、2Dグラフィックスを扱うDirectDraw、オーディオ処理を扱うDirectSoundやDirectMusic、入力デバイスを扱うDirectInput、ネットワーク通信を扱うDirectPlayなど、多様なAPIが含まれています。

DirectXのAPIは、Windowsのバージョンやサービスパックの適用状況によって利用可能なAPIやバージョンが異なるため、注意が必要です。DirectX 12のようにハードウェアに近いローレベルAPIも提供されており、Vulkanと競合しています。また、DirectXの一部はXboxシリーズのゲームコンソールと共通のAPIを使用しています。

その他の静止画、動画・音声関連API



静止画処理にはWindows Imaging Component (WIC) が、動画・音声処理にはVideo for Windows、Media Control Interface (MCI) やWinMM、DirectShowMedia Foundation、Core Audioなどが利用されます。

OpenGL



OpenGLもWindowsで利用できるグラフィックスAPIの一つです。OpenGLとWindows(GDI)との連携部分はWGLというAPIで提供されており、OpenGL 1.2以降の機能を利用するには、Khronosから最新のヘッダーをダウンロードし、WGLの関数を用いてハードウェアベンダーが提供するOpenGL ICDの関数エントリポイントを取得する必要があります。

ネットワーク・インターネット



Windows APIには、ネットワークやインターネットに関連する機能も含まれており、Winsock、NetBIOS、MSRPC、Trident (IEコンポーネント)、MSXML、WinINet、Windows HTTP Services (WinHTTP) などが提供されています。

コンポーネント技術



コンポーネント技術としては、Component Object Model (COM)、Microsoft Transaction Server (MTS)、Distributed Component Object Model (DCOM)、Object Linking and Embedding (OLE)、ActiveX、OLEオートメーションなどが提供されています。

ネイティブAPI



Windows NT系では、Windows APIの下位に位置するネイティブAPIが存在します。Win32 APIは、ネイティブAPI上にサブシステムとして実装されています。ただし、DirectXやGDIなどは、ネイティブAPIを介さずにカーネルと直接やり取りを行うことがあります。

.NET Frameworkとの関係



.NET Frameworkは、Win32 APIを利用して実装されており、Windows FormsやWindows Presentation Foundation (WPF) は、それぞれ内部的にGDI/GDI+またはDirect3Dを利用しています。P/InvokeやCOM相互運用により、.NETアプリケーションからWindows APIを利用することも可能です。

Windows APIの実装



Windows APIの実装は、Windowsのバージョンによって異なり、Win16、Win32、Win64という3つの主要な実装があります。

Win16



Win16は、16ビットプログラム用の実装であり、Windows 1.0からWindows 3.1まで、およびWindows 95/98/Meで利用されました。また、Windows NTではWOW (Windows on Windows) というサブシステムによって実装されました。

Win32



Win32は、32ビットプログラム用の実装であり、NT系の実装を狭義のWin32と呼びます。また、Windows 9x系の実装はWin32cと呼ばれます。Win32sはWindows 3.1用のサブセットであり、Windows CE向けにも実装があります。Win64上では、WOW64 (Windows on Windows 64) というサブシステムによってWin32がエミュレートされます。

Win64



Win64は、64ビットプログラム用の実装です。現在主流のx64のほか、ARM64もサポートされています。IA-64のサポートは、Windows Server 2008 R2で終了しました。

マイクロソフト以外による実装



Windows APIの仕様は公開されているため、WineReactOS、HX DOS Extenderなど、Microsoft Windows以外の環境でもWindows APIの実装が存在します。

WindowsランタイムAPI (WinRT API)



Windows 8で導入されたWindowsランタイムAPI (WinRT API) は、Windowsストアアプリ (Modern UIアプリケーション) 向けの高レベルAPIです。Windows 10では、UWPアプリの開発におけるベースAPIとなっています。従来のWindows APIはWin32 APIと呼ばれることが多いです。

詳細



Unicode対応



Windows APIは、Unicodeに対応しており、マルチバイト文字版とUnicode版の2つのAPIを提供しています。API名の末尾に「A」が付くものがマルチバイト文字版、「W」が付くものがUnicode版です。内部的には、A版のAPIはW版のAPIを呼び出すラッパーとして機能しています。Windows 9x系ではUnicode版APIは一部しか実装されていませんが、Microsoft Layer for Unicodeを利用することで、ほぼ全てのUnicode版APIが利用できます。

歴史



Windows APIの歴史は、Windows自体の歴史と深く結びついています。Windows NTに伴うWin32の登場は、Windows APIの歴史における大きな変革でした。現在、64ビットへの移行が緩やかに進んでいます。

互換性



Windows APIは、互換性に配慮した設計がなされており、バージョンアップの際に既存の公開APIに破壊的な変更が入ることはありません。しかし、DLL地獄 (DLL Hell) が発生することがあり、Side-by-Sideコンポーネント共有や分離アプリケーションとSide-by-Sideアセンブリによって緩和されています。互換性の問題が発生した場合は、Windowsの「互換モード」を利用することで、ある程度回避できます。

批判



Windows APIは、機能の追加により高度に複雑化しており、習得が困難という問題があります。WinRT APIは体系的に整理されていますが、制約が多いこともあり、従来のWin32 APIが主流となっています。

ラッパーライブラリ



Windows APIは低水準であるため、様々なラッパーライブラリやフレームワークが存在します。マイクロソフトが提供するものとして、Microsoft Foundation Class (MFC)、Active Template Library (ATL)、Windows Template Library (WTL) などがあります。また、ボーランドが提供していたObject Windows Library (OWL)やVisual Component Library (VCL)などもあります。さらに、.NET FrameworkやWindows版.NET Coreも内部的にWindows APIを利用しています。

関連項目




参考文献



  • - Charles Petzold著 『プログラミングWindows第5版〈上〉』 アスキー、2000年
  • - Charles Petzold著 『プログラミングWindows第5版〈下〉』 アスキー、2000年
  • - Jeffrey Richter著 『Advanced Windows 改訂第4版』 アスキー、2001年

外部リンク



もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。