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、
DirectShow、
Media Foundation、Core Audioなどが利用されます。
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は、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の仕様は公開されているため、
Wineや
ReactOS、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と呼ばれることが多いです。
詳細
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年
外部リンク