[前へ]   [目次へ]   [次へ]

ハンドル(C/C++)


今回は、ハンドルについてです。
ハンドルは、ファイルを始めとして様々なもので使用するもので、
直接「〜ハンドル」という名前が付けられていたり、
違う名前であっても扱い上はハンドルというものがあります。

さて、ハンドルというのは一言で言うと借り物タグです。

ハンドルを使う場面というのはほとんどの場合、
自分のプログラムとは独立しているライブラリを使用する場合です。

これは形式的には「独立した他のライブラリ」に何かを依頼して、
処理を委任する形になるのですが、その処理が一度では終わらず、
複数回の処理が必要になるケースというのがあります。

その時に「今回の処理が以前のどの処理の続きであるか」を判断するのに使用するのがハンドルです。

ハンドルと同種の性質を持つものとしては以下のようなものが挙げられます。
●ネットサービスでのアカウント
●サイトで使用するセッションクッキー
●ロッカーやホテルなどの鍵

これらの共通点としては、
●使っている間は使用者が持ち続ける
●使い終わったら削除または返却する
●それ自体が識別鍵であり類似の他のものでは代替できない
ということがあります。

よって、同種の性質を持つハンドルでも以下のことが言えます。
●処理が終わるまではハンドルを維持すること
●処理が終わったらハンドルを提供したライブラリに終了処理を行うこと
●ハンドルを複製できることはあるがライブラリから提供された以外のハンドルは使用できない

で、ハンドルは具体的には何かというと、多くの場合はIDか、ポインタです。
ただしどちらの場合でもその値をどう解釈すればよいかについては通常不明です。
というのも、ハンドルの値を解釈して何かをするのは処理を委任するライブラリの方なので、
使用する側のプログラムがハンドルの値の意味を知る必要がないからです。
むしろ下手に意味を知られていじって壊されると嫌なので、隠蔽される場合の方が多いです。

なので、ハンドルを提供するライブラリを使用する側としては、
1.ライブラリからハンドルを提供してもらう
2.提供されたハンドルはそのまま指定された型で保存する
3.保存したハンドルは代入以外の操作をしない
4.処理の過程でライブラリの要求に従って提供されたハンドルを渡す
5.処理が終わったらライブラリにハンドルを返却する
6.返却したハンドルはすぐ捨てる(バグ防止のため)
ということになります。

ライブラリによっては同時に提供できるハンドルの数に上限がある場合があり、
処理が終わったハンドルをいつまでも持っていると新しいハンドルを提供してもらえなくなることがあります。
処理が終わったハンドルは速やかに返却するようにしてください。

特にWindowsが管理するハンドルの中にはWindows全体で上限が決まっているハンドルもあり、
そのようなハンドルを返さないでいると大変なことになることがあります。
Windows98などではモノによっては上限が5とかいうハンドルがあり、
握りっぱなしにしていると簡単に大変なことになったりしたらしいです。
XP以降でも上限は大きく増えたものの、大量に握っていると困ったことになるものもあります。



さて、ハンドルを提供してもらう関数には大抵、
Create とか New とか Lock とか Alloc とか Open などの名前が付いています。
また、ハンドルを返却(または削除)する関数には大抵、
Delete とか Erase とか Release とか Free とか Close などの名前が付いています。

ライブラリの資料を見ていてこういった名前の関数を見つけた場合は、
ハンドルの取得や返却を行う関数である可能性が比較的高いです。(対になっていたらさらに可能性が高いです)

残念ながら、全てのハンドル関連関数がこの命名を持っているわけではありません。
これらの名前が付いていてもハンドル関連の関数ではないこともあれば、
これらの名前が付いていなくてもハンドル関連の関数ということもあります。

なので最終的には仕様を確認しなければいけないのですが、
使い方のよくわからないライブラリを手に入れた場合はまずはこれらの名前のついた関数から探すと、
使い方のヒントがわかることもあります。(これらが処理の起点であることが多いため)


次回はファイル制御の基本の予定です。

[前へ]   [目次へ]   [次へ]

プログラミング講座 総合目次

最終更新 2010/08/20