Windowsでは、プログラムを構成するプロセスやスレッド、ファイルなどから、ウィンドウ、アイコン、カーソル、ビットマップ、フォント、さらにはプログラムが確保したメモリ領域に至るまで、とにかく実体を持つあらゆるものがオブジェクトとして扱われています。
では、そもそも、この「オブジェクト」というのはいったいなんなのでしょうか。英語の object は「物・物体・対象・目的・目標」などの意味がありますが、どうもこれだけではピンときません。
そこで、ここでは、プログラミングの世界における、その「オブジェクト」の意味を述べていくことにします。
アプリケーションプログラムはさまざまな要素によって構成されています。この「要素」というのは、プログラムによって表示されるウィンドウ、そのプログラムが扱うファイル、そのプログラムが扱うここのドキュメントなど、すべてのもののことを指しています。それぞれの要素を1つの「もの(object)」として考え、その「もの」自体が、自分自身の状態を保持し、自分自身で動作することができる、
オブジェクト指向という言葉を聞いたことがあるでしょうか。 これには、「再利用可能なプログラムコードを蓄積することを主な目的として、関連あるデータとコードをひとまとめにして、1つのオブジェクト(もの)として扱うプログラミング手法」のことを言います。
アプリケーションによってウィンドウが作成されると、Windowsはハンドルウィンドウハンドルと呼ばれるウィンドウを識別するための値を作成されたウィンドウに割り当て、以下のようなすべてのウィンドウを管理するためのテーブル(表)にそのウィンドウの情報を追加します。ハンドルはウィンドウごとに異なった値となっています。ウィンドウに関する情報が必要になったとき、Windowsはウィンドウハンドルを元にそのテーブルを参照することで目的となるウィンドウに関する情報を引き出します。
このような表が作られると考えてください。 (実際は違うかもしれませんが…)
ウィンドウハンドル | X位置 | Y位置 | Xサイズ | Yサイズ | ウィンドウのスタイル | … | … |
---|---|---|---|---|---|---|---|
4213312 | … | … | |||||
12311123 | … | … | |||||
2342232 | … | … | |||||
…… | … | … | … | … | … | … | … |
アプリケーションがAPIを使ってウィンドウに何らかの処理をしたい場合、対象となるウィンドウのハンドルを指定してAPIを呼び出せば、目的の処理が実現されるのです。
もちろん、HSPで作成したID0〜のウィンドウもウィンドウハンドルを持ちます。また、HSPの命令で作られたエディットボックスやコンボボックスなどもそれぞれのウィンドウハンドルを持っています。しかしこれらのハンドルはHSPが内部で処理をしているために普通は私たちの目に触れることはありません。したがって、HSPでのプログラミングはこういったウィンドウハンドルを意識することなく行うことができます。
Windowsシステムは、主に、カーネルオブジェクト、ユーザーオブジェクト、GDIオブジェクトの3種類のオブジェクトを提供しています。カーネルオブジェクトは、メモリ管理、プロセス実行、プロセス間通信(IPC)をサポートするオブジェクトです。ユーザーオブジェクトはウィンドウなどのユーザーインターフェース管理を、GDIオブジェクトはグラフィックスなどの描画機能をサポートします。
カーネルオブジェクトはWindowsシステムの中核であるカーネルによって確保されるオブジェクトのことで、例として、以下のようなものがあります。
これらのカーネルオブジェクトは、それぞれに対応するWindows API関数を呼び出すことによって作成されます。例えば、 CreateMappingObject 関数を呼び出すとファイルマッピングオブジェクトが作成されますし、 CreateMutex 関数を呼び出せばミューテックスオブジェクトが作成されます。これらカーネルオブジェクトの実体は、カーネルによって確保され、カーネルしかアクセスできないメモリブロックに作成されたメモリブロックであり、そこにはオブジェクトについてのさまざまな情報が格納されています。
このメモリブロックにはカーネルからしかアクセスできず、アプリケーション側からこのメモリブロックに直接アクセスすることができません。そのため、アプリケーションからカーネルオブジェクトを操作するためには、それぞれのオブジェクト専用のAPI関数を呼び出す必要があります。