Windows API
Windows API(ウィンドウズ エーピーアイ)とは、Microsoft WindowsのAPIのことである。特に32ビットプロセッサで動作するWindows 95以降やWindows NTで利用できるものはWin32 APIと呼ばれる。また、それらのWindowsにおけるWin32 APIの実装をWin32と呼ぶ。
目次
概要
Windows上で動作するアプリケーションにとって、Windows APIはWindowsの各機能にアクセスするための接点である。そのため、Windows上で動作するアプリケーションを作成できる様々なプログラミング言語・開発環境においてWindows APIを使用する手段が提供されている。特にCとC++では、Windows SDKにより、<windows.h>をはじめとする多数のヘッダファイルが公開されている。また、多くの開発環境で、Windows APIを基にしたより高水準のフレームワークが構築されている。これらを通じて、直接・間接にすべてのWindowsアプリケーションはWindows APIを使用している。
Windows APIに属する各APIは、主にDLLからの関数またはCOMインタフェースとして機能を公開している。関数の呼出規約は原則としてstdcallを採用する(Win32の場合)など統一されたインタフェースで多数のプログラミング言語からの使用を容易なものとしている。
分類
Windows APIの中核となる機能はKernel、User、GDIに分けられる[1]。当初は、それぞれKERNEL.EXE (モードによってはKRNL286.EXE、KRNL386.EXE)、USER.EXE、GDI.EXEに実装されていた。32ビット化されて以降は、KERNEL32.DLL、USER32.DLL、GDI32.DLLに実装されている。
- Kernel
- ファイルシステム、デバイス、プロセス、スレッド、レジストリ、例外処理など基盤となる機能
- User
- ウィンドウの処理、ボタンやスクロールバーなどといった基本的なコントロール、マウス・キーボード入力、その他グラフィカルユーザインタフェース (GUI) に関わる機能。
- GDI
- ディスプレイ・プリンタをはじめとした出力装置への描画機能
現在では、これだけに留まらず、多数のDLLから無数の機能が公開されている。現在、マイクロソフトのドキュメントでは次のように分類している[2]。
- Administration and Management
- Diagnostics
- Graphics and Multimedia
- Networking
- Security
- System Services
- Windows User Interface
なお、この分類では、KernelはDiagnosticsとSystem ServicesそしてSecurityに跨って属し、UserはWindows User Interface、GDIはGraphics and Multimediaに属する。
グラフィックとマルチメディア
DirectX
マイクロソフトは、現在全てのWindowsにDirectXを用意している。DirectXは主にゲームとマルチメディアのためのAPIであるが、特にWindows Vista以降はDirectX GraphicsがGDIに代わってOSのグラフィックス描画の基盤として昇格されている。DirectX APIのうちのいくつかは、ゲームコンソールであるXbox、Xbox 360、Xbox Oneと共通になっている。
- Direct3D
- OpenGLの置き換えとして3D グラフィックスアクセラレータの操作。
- DirectDraw
- 2D グラフィックスアクセラレータの操作。DirectX 8.0以降、DirectDrawはDirect3Dに吸収された。
- DirectX Graphics
- DirectX 8.0以降に導入された名称で、Direct3DおよびDirectDrawの統合を意味するものだったが[1]、現在はDXGI/Direct3D/Direct2D/DirectWriteの総称となっている[2]。
- DXGI (DirectX Graphics Infrastructure)
- Direct3D 10以降、DirectX Graphicsから比較的変化の緩やかな部分はDXGIとしてDirect3Dから分離された。
- Direct2D
- Direct3D上に構築された高レベル2D描画用API。GDI+の置き換えとなる。
- DirectWrite
- テキストおよびフォント/フォントグリフを扱う。
- DirectSound
- 低水準なハードウェア(主にサウンドカード)への操作。
- DirectMusic
- DirectSoundの上位に位置し、音楽(メディアファイルの再生など)を扱う。
- DirectX Audio
- DirectX 8.0以降に導入された名称で、DirectSoundおよびDirectMusicの統合を意味するものだったが[3]、現在はX3DAudio/XAudio2/XACT/DirectSoundなどの総称となっている[4]。
- DirectInput
- ジョイパッドやゲームパッドの入力。
- XInput
- Xbox 360コントローラーをWindows上で使えるようにするAPI。
- DirectPlay
- ネットワークなどを介した通信。
- DirectShow
- 汎用的なマルチメディアパイプラインシステム。
DirectX APIはWindows APIの中でも変化が激しいAPIのひとつで、Direct3D RM、DirectDraw、DirectSound、DirectInput、DirectPlay、およびDirectMusicはWindows Vista以降完全な互換機能が用意されず、一部を除いて廃止あるいは代替APIに吸収されている[5]。
動画・音声
OpenGL
- WGL
- OpenGLとWindowsとの連携部分を担当するAPIである。なお、Windows SDKに付属するOpenGLヘッダーおよびライブラリにはOpenGL 1.1までの関数しか定義されておらず、そのためOpenGL 1.2以降の機能を使うためには、Khronosから最新のOpenGLヘッダーをダウンロードしたのち、WGLのwglGetProcAddress()関数を用いてハードウェアベンダーが提供するOpenGL ICD (Installable Client Driver) の関数エントリポイントを取得するなどの作業が必要となる[3]。
ネットワーク・インターネット
コンポーネント技術
- Component Object Model (COM)
- Microsoft Transaction Server (MTS), Distributed Component Object Model (DCOM)
- Object Linking and Embedding (OLE), ActiveX, OLEオートメーション
ネイティブAPI
ネイティブAPIは、Windows NT系においてWindows APIより下位層のAPIである。NT系では、NTネイティブAPI上にサブシステムとしてWin32 APIが実装されている。ただし、DirectXやGDIなどは、ネイティブAPIを介せずに、より下位に位置するカーネルと直接やり取りを行う。
.NET Frameworkとの関係
Windowsで動作する.NET Frameworkは、基本的にWin32APIを用いて実装されている。
かつて、Windows Vista以降、WinFX (.NET Framework 3.0) がWindows APIに代わってネイティブAPIになる(WinFXが最も低水準なAPIとなりWindows APIはそのラッパーとなる)とアナウンスされたことがあったが、結局撤回され、Windows Vista製品版では従来通りWindows APIがネイティブなAPIとなっている。
実装
Windows APIは名前からも類推できるとおり、主にMicrosoft Windowsに実装されている。その実装はWindowsのバージョン毎に少なからず違いが存在する。たとえばWin32の場合、Win32c、Win32sではごく一部を除きUnicodeに対応していない、セキュリティ対策のアクセス制限が実装されていないなどといった違いが挙げられる。そしてそれは大きく次のように分類することができる。
Win16
Win16は、16ビットプログラム用の実装である。ただし、Win16という語自体はWin32が登場してから用いられるようになった語である[4]。Win16は大きく2種類に分けられる。
- Windows 1.0からWindows 3.1までおよびWindows 95/98/Me (9x系)の実装。
- WOW (Win16 on Win32): Windows NTによるWin16サブシステムによる実装。
Win32
Win32は、32ビットプログラム用の実装である。次のように分けられる。
- Win32
- 狭義のWin32は、NT系の実装を指す。
- Win32c
- 9x系の実装。'c'は「compatibility」(互換)の頭文字である。しかし、現在では9xの実装も区別なくWin32と呼ぶ[5]。
- Win32s
- Windows 3.1用の実装。's'は「subset」(サブセット)の頭文字である。Windows 3.1には搭載されておらず、別途入手・インストールする必要がある。
- Win32 for Windows CE[6]
- Windows CEの実装。文字コードにUnicodeのみを使用するなどの点が特徴的である。
- WOW64 (Windows on Windows 64)
- Win64上でWin32をエミュレーションするサブシステムによる実装。
Windows NTがx86以外のアーキテクチャに移植されたことに伴い、Win32は各種アーキテクチャ向けに移植されている[7]。また、Windows NTではないが、かつてMacintosh用のWin32も存在し、Microsoft Visual C++ 4.0 Cross-Development Edition for Macintoshとしてクロスコンパイラとともに発売されていた[8]。これらアーキテクチャの異なるWin32の間にはソースコード上での互換性がある。
Win64
Win64は、64ビットプログラム用の実装である。現在、IA-64及びx64用の2種類の実装が存在する。
WinRT
テンプレート:Main Windows 8のストアアプリ (MetroStyleApp) で採用。
マイクロソフト以外による実装
Windows APIの仕様はWindows SDKのドキュメントやMSDN ライブラリで公開されており、それを基にしたMicrosoft Windows以外のWindows APIの実装が存在する。
詳細
Unicode対応
Win 9x | Win NT | Win CE | |
---|---|---|---|
A | テンプレート:Yes | テンプレート:Yes | テンプレート:No |
W | テンプレート:No2一部対応 | テンプレート:Yes | テンプレート:Yes |
Windows NT系では当初からUnicodeが用いられている一方、Unicodeに対応していないWin16と互換性を取るために、Win32 APIから同じAPIに対してマルチバイト文字版とUnicode版の2つを用意し、C/C++のマクロを駆使してコンパイル時にどちらを使うか選択できる仕組みが採用されている[9]。なお、Unicodeの符号化には当初UCS-2、Windows 2000から正式にUTF-16が用いられている[10]。
具体的には、文字および文字列の関わる関数・構造体について、マルチバイト文字(Windowsコードページに基づく、日本語環境であればコードページ932)とUnicode (UTF-16) のどちらを与えることもできるように、2つの関数・構造体などが準備されている。その場合、マルチバイト文字列を与えるべき関数・構造体は末尾に「A」を付け、ワイド文字列を与えるべき関数・構造体は末尾に「W」を付けて区別している。例えば、Win16のMessageBox関数に対して、Win32ではMessageBoxAとMessageBoxWという2つの関数が用意されている。そして、プリプロセッサ識別子UNICODEの定義の有無によって切り替えが行われる。
#ifdef UNICODE
#define MessageBox MessageBoxW
#else
#define MessageBox MessageBoxA
#endif
さらに、文字型に対しても同様にCHAR (charのtypedef) とWCHAR (wchar_tのtypedef) をUNICODEの定義で切り替えるTCHAR型などや、ナロー文字列定数・リテラルとワイド文字列定数・リテラルを切り替えるTEXTマクロが存在する。
#ifdef UNICODE
#define TEXT(s) L ## s
typedef WCHAR TCHAR;
#else
#define TEXT(s) s
typedef CHAR TCHAR;
#endif
これらを適切に用いると、1つのソースコードからコンパイル時のオプションによってマルチバイト文字を用いる実行プログラムとワイド文字を用いる実行プログラムの2種類が作成できる。以下はその例である。
#include <windows.h>
int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpszCommandLine, int nCmdShow)
{
MessageBox(NULL, TEXT("Hello, world"), TEXT("App"), MB_OK);
return 0;
}
なお、Windows NT系におけるA版のAPI関数は、Unicodeとの変換を行いW版を呼び出すラッパーとなっている[11]。
このプレフィックスのAはANSI、WはWideを意味する[12]。ANSIは、Windowsコードページの一部がANSI規格のドラフトを元にしたことに由来する[13]。ワイド文字 (wchar_t) はC/C++の用語であるが、Windows用のC/C++処理系において、ワイド文字は大抵UCS-2またはUTF-16として実装されている。また、OLE関係では、Win32ですべてUnicode化され、A/Wの区別が存在しない。
なお、Windows 9x系では、Unicode版APIは一部しか実装されていない[14]。ただし、Microsoft Layer for Unicodeを利用することにより、ほぼすべてのUnicode版APIが使用可能になる[15]。また、Windows CEでは、逆にUnicode版APIしか実装していない。NT系でも、Unicodeを前提とした仕様変更が行われたり[16]、Theme APIなど新しいAPIでA/Wの2種を用意せずUnicodeを用いるものだけを用意したりするなど、徐々にUnicodeへ傾斜する傾向にある。
歴史
Windows APIの歴史は、もちろんWindows自体の歴史と切り離せない関係にある。常に、Windowsに新機能が搭載されれば、それをアプリケーションソフトウェアから使用するための新しくAPIが追加され、新しいSDKが公開されることの繰り返しである(もちろん、デバイスドライバらに対応を迫るものは、DDK/WDKで公開される)。
Windows APIの歴史上、最も大きな変革はWindows NTに伴うWin32の登場だった。ポインタとハンドルも32ビット化されたこと、Unicodeへの対応が図られたことが大きな変化である。
なお、現在は緩やかに64ビットへの移行が進んでいる。64ビット化では、16ビットから32ビットのときのような大きな変化はない。
批判
Windows APIはWin16を拡張して32ビット、64ビット化されたという歴史がある。そのため度重なる機能の追加により、高度に複雑化しその習得が困難と化しているという問題がある[17]。
また、度重なるバージョンアップによりコンポーネントの互換性を失ってしまうことによるDLL地獄 (DLL Hell)の発生を招いている。
ラッパーライブラリ
Windows APIは比較的低水準であるため、高水準なインタフェースを持たせるための様々なラッパーが数多く存在する。主なものは次のとおり。
マイクロソフト
- Microsoft Foundation Class (MFC)
- C++クラスによるWindows APIのラッパー。
- Active Template Library (ATL)
- テンプレートによるCOMのラッパー。
- Windows Template Library (WTL)
- ATLの拡張として作られた軽量のWindows APIのラッパー。現在はCPLに基づくオープンソースとなっている。
ボーランド
- Object Windows Library (OWL)
- MFCと同時期に公開され、よりオブジェクト指向に作られたラッパー。
- Visual Component Library (VCL)
- ボーランドがその後に作ったDelphiによるラッパー。
.NET FrameworkにもWindows APIをラップした部分が存在する。
脚注
関連項目
参考文献
- Charles Petzold著 『プログラミングWindows第5版〈上〉』 アスキー、2000年。ISBN 4756136001
- Charles Petzold著 『プログラミングWindows第5版〈下〉』 アスキー、2000年。ISBN 475613601X
- Jeffrey Richter著 『Advanced Windows 改訂第4版』 アスキー、2001年。ISBN 4756138055
外部リンク
テンプレート:Widget toolkits- ↑ テンプレート:Cite book
- ↑ テンプレート:Cite web
- ↑ OpenGL (Windows)
- ↑ テンプレート:Cite book
- ↑ テンプレート:Cite book
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web