• ベストアンサー

グローバルで宣言

HWND g_wnd; のようにグローバルで宣言して1つのウインドウを作った場合、 それに対応するWndProcで LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg ,WPARAM wp, LPARAM lp) { ここでは、hwndとg_wndはどっちを使っても同じですか? }

質問者が選んだベストアンサー

  • ベストアンサー
  • uoot
  • ベストアンサー率75% (6/8)
回答No.3

ほぼ同じと断言できますが、特殊なことをやるときに異なる場合があります。 ウィンドウプロシージャがメッセージを受け取った際には、「このウィンドウについて」処理を行ってくださいという明確なウィンドウ指定がウィンドウハンドルによって行われているため、渡されたウィンドウハンドルである hwnd を使うべきです。 特殊な例とは、別のウィンドウであるメッセージ処理を行うために、この WndProc() で記述されているメッセージ処理を行いたい場合に CallWindowProc() を使って(または直接関数を呼んで)メッセージ処理を任せてしまう場合などが考えられます。このような呼ばれ方をした WndProc() 内で g_wnd を用いると不都合が起こってしまいます。 もちろん、こんなことは通常やらないほうが良いですが...

yuyata
質問者

お礼

ありがとうございます。 そのような場合に違いが発生するんですね。

その他の回答 (5)

  • fruipa
  • ベストアンサー率38% (14/36)
回答No.6

みなさんが言われている内容は、ほぼ同じことで出している例が違っているだけです。 特にNo.1とNo.2の方は、全く同じ内容です。(^^; つまり、 グローバル変数はいつどこからでも参照・変更できるので 安易に使いたくなりますが、どこかでうっかり内容が変わってしまい、 いざ使う時に欲しいデータが入っていない可能性がありますよ、 と言う事です。 みなさん苦い経験をお持ちなのでしょう。(いや、実は私も・・・) みなさんが言われている通り、引数で渡せるなら引数でやった方が 絶対いいと思いますよ。

yuyata
質問者

補足

僕は全ての人が、No.1とNo.2の回答を全く同じ内容に思えるとは思えない。

  • cherry3
  • ベストアンサー率39% (18/46)
回答No.5

例えばCreateWindowでウインドウを作成した場合、戻り値をg_wndに入れると思いますが、 WM_CREATEメッセージが来た時点では、まだg_wndに値が入りません。 その時にg_wndを使うと、思わぬバグが発生したりします。 つまらないバグを招かない為にもウインドウプロシージャ内では hwndの方を使った方が安全だと思います。

yuyata
質問者

お礼

そうですね。安全にやるなら今の時点ではhwndを使えばいいのですが、 この違いについて知りたいと思いました。

  • MovingWalk
  • ベストアンサー率43% (2233/5098)
回答No.4

#2です。#1の方へのコメントを見て気になったので一言。 >別の答えももらったということで、他の方の意見も待ってみようと思います。 これって、どういう理解なんでしょう?? 「関数内で常に、hwnd とg_wnd が同じ値なら、結果としては同じ」といって いるにすぎません。Windowsなどのイベント駆動型の場合、グローバル変数は 他の関数で書きかえられる可能性がないとは言えません。 このことを考慮すれば、エントリ時点のハンドルを元に処理するなら引数の値を、 使用するべきです。(これは常識だと思いますが) >グローバルで定義したのは、...自作の別の関数でその... ということなら、この関数で使用する目的ではないので、引数を使えば いいことで、この質問の意図が全く意味不明ですね。

  • MovingWalk
  • ベストアンサー率43% (2233/5098)
回答No.2

関数内で常に、hwnd とg_wnd が同じ値なら、結果としては同じですね。 でも、それならg_wndを定義することはありませんね。 設計がおかしいことはないでしょうか。

yuyata
質問者

お礼

ありがとうございます。同じなのですね。 グローバルで定義したのは、この例では書かなかったけど、 自作の別の関数でそのウインドウハンドルを使うためでした。

  • HUTABA
  • ベストアンサー率27% (436/1611)
回答No.1

型は同じですが、 >LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg ,WPARAM wp, LPARAM lp) が呼び出される際にhwndがg_wndとは別のハンドラを指定している可能性は0ではないと思います。 ですから、関数内ではhwndを使用するのが安全です。 「きっと同じだろう」と思ってg_wndを使用すると、思わぬバグが発生する可能性がありますよ。

yuyata
質問者

お礼

ありがとうございます。 HUTABAさんの回答を見る前に、MovingWalkさんの回答を見て同じ物だと思っていました。 別の答えももらったということで、他の方の意見も待ってみようと思います。

関連するQ&A