今回は、Win32 APIについて説明しましょう。
前回にも述べたとおり、API (Application Programming Interface) とはOSやシステムが提供する機能にアクセスするためのインターフェースです。実際には、関数セットの形で提供されていて、この関数セットのことをAPIと呼ぶことがあり、通常は、その関数セットの中に含まれている個々の関数をAPI関数と呼びます。また、その個々の関数(API関数)のことを単にAPIと呼ぶこともあるようです。
前にも言いましたが、APIはプラットフォームの統一を目的として提供されています。プログラマがWindowsアプリケーションを作成するのを容易にし、作成されたアプリケーションが原則としてどのWindowsマシンでも実行できるようにするためのものです。
昔のコンピュータのようにOSというものがなかった時代は、キー入力や画面の操作などといったハードウェアを直接操作するようなことをアプリケーションのプログラムコード中で行う必要がありました。こういった操作は非常に複雑なものであり、そのためのプログラムコードを書くことはとても面倒な作業だったのです。また、こういったプログラムコードはデバイスに依存していて、同じプログラムが別のマシンでは動かない、といったこともしばしばあったと思われます。
そこで、こういった問題点を解消するために、基本的な入出力の機能をOSが提供したらどうか、ということになりました。こうすることで、毎回入出力のためのコードを記述する必要がなくなり、必要なAPI関数を呼び出すだけでその機能を実現できるようにしたのです。また、同じOSがインストールされていればどのようなコンピュータでも同じAPI関数を呼び出すことによって同じ機能を実現するすることができるようになったのです。前にも言いましたが、このようなことをプラットフォームの統一と呼びます。つまり、プログラマがアプリケーションプログラムを作成するのを容易にし、作成されたアプリケーションが原則としてそのOSがインストールされているどのマシンでも実行できるようにしているのです。
実際には、同じOSがインストールされているマシン同士であっても、CPUアーキテクチャが違う場合には、実行可能プログラム(Windowsの場合は .exe やDLL)に互換性がなくなってしまいます。例えば、Intel x86系CPUを持つマシンとAlpha系CPUを持つマシンでは、マシン語そのものに互換性がないために、x86系CPUマシン用に作られた実行可能プログラムを、同じOSがインストールされているAlpha系CPUマシンで動かすことはできないということです。しかし、そのプログラムが、C/C++などの高級言語で書かれていて、かつ、OSが提供するAPIを使用しているものであるなら、プログラムを書き換えることなくAlpha系用にコンパイルし直すだけで、Alpha系用実行可能プログラムを作成することができます。「プラットフォームの統一」という概念には、このような開発環境の統一も含まれているのです。
このように、APIが統一されているために、プログラムを書き換えることなくコンパイルし直すだけで実行できるようなプログラムはAPI互換がある、といいます。WindowsなどのOSはAPI互換があるので、上で述べたようなCPUアーキテクチャが違うマシン間でも、再コンパイルだけでプログラムを実行できるようになります。
一方、再コンパイルすらも必要なく、実行可能プログラムがすべてのマシンで動作するようなものをABI互換がある、といいます。JavaはプログラムにABI互換性を持たせることを目的とした言語であり、Javaで作成されたプログラムは、Java VM(Java仮想マシン)がインストールされたすべてのマシン上で実行できるようになっています。
Windowsが提供するAPIのことを特にWindows APIと呼びます。Windows APIは、Windowsがバージョンアップを重ねるごとに拡張されてきています。
Windows APIには、Windowsのバージョンに応じて、いくつかの種類があります。
Windowsのバージョン | 環境 | APIの種類 |
---|---|---|
Windows 3.0 / 3.1 | 16ビット | Win16、Win32s |
Windows 95/98/98SE/Me | 32ビット | Win16、Win32s、Win32(Win32c) |
Windows NT/2000/xp | 32ビット | Win32 |
Windows APIには、大きく分けると16ビット環境用のWin16と、32ビット環境用のWin32の2つがあります。また、16ビット環境でWin32の提供するAPIを使えるようにした Win32s というものもあります。
現在主に使われているWindows 95 / 98/ 98SE / Me / NT / 2000 / xp は、32ビット環境用のOSであり、これらのWindowsはWin32 APIを提供していることになります。
ただし、Windows 9x 系(Windows 95 / 98/ 98SE / Me)は32ビットOSなのですが、前回も述べたように、これらのシステムは過去の16ビット時代との互換性を優先して設計されており、実際にシステム内部では16ビットで動いているところが多く含まれています。そのため、完全な32ビットOSとはいえず、Windows NT 系(Windows NT / 2000 / xp)が提供しているAPIとは、厳密には異なる部分があります。そのため、9x 系が提供するAPIを Win32c として区別する場合があります。(実際には、Win32cはWin32とほとんどの部分について同じであり、Win32cと表現されることはほとんどありませんが。)
Win32 APIがどういうものかがわかったところで、これらのAPIは、いったいどこにあるのでしょうか?
実は、APIはDLL(Dynamic Link Library;ダイナミックリンクライブラリ)と呼ばれる、ファイル名の拡張子が“.dll”となったバイナリファイルの中にあるのです。HSPではDLLは拡張プラグインとして使われていますよね。(必ずしもDLLの拡張子が“.dll”である必要はないため、HSPでは“.hpi”も使われていますけどね。) DLLについてはここでは詳しくは述べませんが、簡単にいうと、ある特定の機能を実現する関数(プログラムコード)の入っているバイナリファイルのことを言います。WindowsはAPIを提供するためのいくつかのDLLを標準で持っていて、アプリケーションはこのDLLの中にあるプログラムコードを呼び出して実行することで機能を実現することができるのです。
特に、以下に示す3つのDLLが提供する機能はWindowsの中核をなすもので、これらのDLLが提供するAPIはWindowsアプリケーションの開発には不可欠です。
DLLファイル名 | 主なAPIの機能 |
---|---|
kernel32.dll | OSの根幹であり、プロセス、メモリや周辺装置を管理 |
gdi32.dll | 文字列やグラフィックスの描画に関するサービスを提供 |
user32.dll | ウィンドウベースのユーザー インターフェースを管理 |
また、これらのほかにも、 Windows シェルの中核をなす shell32.dll や、コモンコントロールの機能を提供する comctl32.dll など、数多くの DLL があり、それぞれが多くのAPI関数を提供しています。