ウィンドウのデバックと「unused」

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
彦左衛門

ウィンドウのデバックと「unused」

#1 投稿記事 by 彦左衛門 »

彦左衛門で御座います。

ウィンドウプログラムの終了前に、デバックウィンドウでウィンドウに関する情報を表示し、ウィンドウハンドルに関する「~オブシェクトポインタ」とかの左のプラスマークをクリックすると、「unused アクセスできません」とか、「unused 0(&H0)」とかで unused の後ろが数値だったりしますが、それらはどんな意味を有しているのでしょうか。ウィンドウプログラムの終了前に unused の後ろが「unused 0(&H0)」以外の数値だったりしたらまずかったりしますか。

これらに関する御理解と、御時間の有る方、御願い致します。
彦左衛門

申し訳在りません。

#2 投稿記事 by 彦左衛門 »

× デバック
○ デバッグ
NoWest
記事: 264
登録日時: 2005年5月31日(火) 10:52
お住まい: 高知
連絡する:

Re: ウィンドウのデバックと「unused」

#3 投稿記事 by NoWest »

> 彦左衛門で御座います。
>
> ウィンドウプログラムの終了前に、デバッグウィンドウでウィンドウに関する情報を表示し、ウィンドウハンドルに関する「~オブシェクトポインタ」とかの左のプラスマークをクリックすると、「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を代入した方が良い場合もあります。
彦左衛門

Re: ウィンドウのデバックと「unused」

#4 投稿記事 by 彦左衛門 »

NoWest さん、大変分かり易く丁寧な素早い御返信有難う御座います。

理解出来たと思います。有難う御座いました。
返信する