> 彦左衛門で御座います。
>
> ウィンドウプログラムの終了前に、デバッグウィンドウでウィンドウに関する情報を表示し、ウィンドウハンドルに関する「~オブシェクトポインタ」とかの左のプラスマークをクリックすると、「unused アクセスできません」とか、「unused 0(&H0)」とかで unused の後ろが数値だったりしますが、それらはどんな意味を有しているのでしょうか。ウィンドウプログラムの終了前に unused の後ろが「unused 0(&H0)」以外の数値だったりしたらまずかったりしますか。
>
> これらに関する御理解と、御時間の有る方、御願い致します。
HWNDやHBITMAPというような
ハンドルと呼ばれる変数型は多くの場合unusedメンバを持つ構造体へのポインタとして定義されています。
includeフォルダ内のwindows.sbpを開くと下のような定義がありますので興味があれば確認してください。
コード: 全て選択
Type _System_DeclareHandle_HWND:unused As DWord:End Type
TypeDef HWND = *_System_DeclareHandle_HWND
このような定義になったのは最近のことなのですが、以前は
コード: 全て選択
TypeDef HWND = DWord
というように定義されていましたが、このようにしてしまうと、
HWND = HMENU = HANDLE = HBITMAP = DWord
のようにどの変数型も同じになってしまい、
間違って
コード: 全て選択
Dim hWnd As HWND
hWnd=GetDC(hMainWnd)
としてしまってもHDCとHWNDが同じDWordだとするとコンパイラがその間違いに気付いてくれません。そこで、ハンドルをそのハンドルに
特異な構造体へのポインタとして定義することでハンドル同士を見分けている訳です。
それでやっと本題なのですが、
unusedというのはメンバを持たない構造体を作成することが出来ないので仕方なく定義しているものです。ですから、「unused」
”使えない”という名前の通りこのメンバ変数は無視して頂いてかまいません。これはC++等と全く同じ仕様です。
次にプログラム終了時にハンドルを0にしないといけないか? という質問ですが、0にしなくても全く問題ありません。
というのも
ハンドルはポインタで定義されていますが実際に格納されるハンドル値は何かのアドレス等ではないからです。
ハンドルは基本的にそのハンドルの種類ごとに破棄する方法が決まっています。
例えば、ウィンドウハンドル「HWND」であればHWNDハンドルが指し示しているウィンドウがDestroyWindow関数などで消されると同時にそのハンドルも全く意味を持たない数値に変化します。
同じようにLoadImage関数などで得られたビットマップハンドル「HBITMAP」はメモリ上に格納されたビットマップを管理しているハンドルですが、DeleteObject関数で破棄された時点でハンドルではなく、ただの数値に変わります。
ハンドルを破棄せずにプログラムを終了するのは控えた方が良いですが、ちゃんと破棄されたハンドル変数に格納された数値は無視しても構いません。
ちなみにハンドルが使用されていないということを明示的に示したい場合は
コード: 全て選択
Dim hbmp As HBITMAP
/*なんかの処理*/
DeleteObject(hbmp As HBITMAP)
hbmp=0
というように0を代入した方が良い場合もあります。