アークピットのホームページに戻る

WinAPIトピックのトップページに戻る

APIトピックの各章に移動する

ダウンロードのページに移動する
ダウンロードができ
ない場合の対処法
 

ページ移動

2-3-2. ウィンドウプロパティの機能

 プロパティリストは、アプリケーションがウィンドウと関連付ける必要があるデータのハンドルを格納する、メモリ領域です。

プロパティリストの使いかた

 あるウィンドウのプロパティリストにデータハンドルを設定すると、そのウィンドウにアクセスできるアプリケーションは、そのハンドルにもアクセスできるようになります。プロパティリストは、アプリケーションがウィンドウを修正する必要があるときに、データ(代わりのタイトルやウィンドウメニューなど)を作成するのに使用すると便利です。 ウィンドウはそれぞれ自分のプロパティリストを持っています。ウィンドウの作成時には、プロパティリストは空です。リストにエントリを追加するときは SetProp関数を使います。各エントリには、一意なWindows文字列とデータハンドルが含まれます。Windows文字列はこのハンドルを識別するものです。

 データハンドルは、アプリケーションがウィンドウに関連付けようとしているどのようなオブジェクトでも識別できます。GetProp関数は、エントリを削除せずに、リストからエントリのデータハンドルを取得します。アプリケーションはこのハンドルを使用して、データを取得したり使用したりできます。
 RemoveProp関数は、不要になったエントリをリストから削除します。  プロパティリストは、データをウィンドウに関連付けて、そのウィンドウを所有するアプリケーションがデータを使えるようにするためのものです。しかし、プロパティリストのハンドルは、そのウィンドウにアクセスできるすべてのアプリケーションからアクセスできます。つまり、アプリケーションは、ほかのアプリケーションが作成したウィンドウのプロパティリストからデータハンドルを取得して、それを使うこともできます。ただし、ほかのアプリケーションのデータハンドルを使うときには注意が必要です。ほかのアプリケーションから使えるデータは、GDI描画オブジェクトのような共有グローバルメモリオブジェクトだけです。プロパティリストにローカルメモリハンドル、グローバルメモリハンドル、またはリソースハンドルが含まれているときは、ウィンドウを作成したアプリケーションだけがプロパティリストを利用できます。アプリケーションは、Windowsクリップボードを使用して、グローバルメモリハンドルをほかのアプリケーションと共有することができます。ローカルメモリハンドルは共有できません。

 プロパティリストの内容を列挙するには、EnumProps関数を使います。この関数は、プロパティリストの各エントリの文字列とデータハンドルを、アプリケーションが提供する関数に渡します。このアプリケーションが提供する関数は、どのような処理も実行できます。
 プロパティリストの中のデータハンドルは、それらを作成したアプリケーションにつねに属しています。プロパティリスト自体は、ほかのウィンドウに関連付けられているデータと同じように、Windowsに属しています。実際には、ウィンドウのプロパティリストはUSERヒープ、つまりUSERライブラリのローカルヒープに割り当てられます。プロパティリスト内のエントリ数には制限は定義されていませんが、実際に作成できるエントリ数はUSERヒープ内の利用可能な領域により制限されます。この利用可能なメモリ領域は、ウィンドウやウィンドウクラスの数、およびウィンドウに関連付けられているオブジェクトの数により異なります。

 アプリケーションは、プロパティリストの中にエントリを作成します。また、ウィンドウが破棄されるか、ウィンドウを作成したアプリケーションがクローズする前に、RemoveProp関数を使用してプロパティリスト中のすべてのエントリを削除しなければなりません。エントリを削除しないと、USERヒープにプロパティリストが残ったままになってしまうため、プロパティリストが使用したメモリ領域をほかのアプリケーションが使えなくなります。さらに、USERヒープがオーバフローしてしまうこともあります。

 アプリケーションは、RemoveProp関数を使用していつでもプロパティリストからエントリを削除できます。ウィンドウがWM_DESTROYメッセージを受け取ったときにプロパティリストにエントリが存在する場合、その時点でエントリを削除しなければなりません。すべてのエントリを確実に削除するには、EnumProps関数を使用して、プロパティリストのすべてのエントリを列挙するとよいでしょう。アプリケーションは、アプリケーション自身がプロパティリストに追加したエントリだけを削除するようにしてください。Windowsも独自にプロパティを追加したり削除したりします。したがって、Windowsがプロパティリストに追加したプロパティをアプリケーションが削除しないように注意する必要があります。

ページ移動