トップページ > プログラム > 2015年10月29日 > NLVhxZ3A

書き込み順位&時間帯一覧

8 位/155 ID中時間01234567891011121314151617181920212223Total
書き込み数0000000000000001020000014



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
Win32API質問箱 Build121 [転載禁止]©2ch.net

書き込みレス一覧

Win32API質問箱 Build121 [転載禁止]©2ch.net
438 :デフォルトの名無しさん[sage]:2015/10/29(木) 15:43:47.89 ID:NLVhxZ3A
>>433
インスタンスのメンバを渡そうとするとアクセス違反が発生するのは相変わらずです。
恐らくインスタンスのポインタが不正なアドレスを指し示しているからなのでしょうが
その原因が釈然としないんですよね。グローバル領域でインスタンスを生成しているので
どこからでもアクセス可能なはずなんですが・・・。

>>434
staticなのはHookProcのみでWndProcはstaticを付けていません。

>>435
WNDCLASSEXのlpfnWndProcにHookProcを指定し
CreateWindowExのlpParamにインスタンス自身のポインタを渡してから
コールバックでHookProcが呼び出された時にGetWindowLongでLPARAMに格納されている
インスタンス自身のポインタを受け取り、それからWndProcを呼び出しています。

>>437
将来的には子ウィンドウをサブクラス化してひとつのインスタンスからすべてのウィンドウを管理するつもりです。
Win32API質問箱 Build121 [転載禁止]©2ch.net
443 :デフォルトの名無しさん[sage]:2015/10/29(木) 17:15:19.02 ID:NLVhxZ3A
>>439
参照したページは下記以外にもありますが、一応の出典はこちらになります。
■■Programmer's Studio■■
http://members3.jcom.home.ne.jp/progstudio/win_tips1.html
■■Programmer's Studio■■
http://members3.jcom.home.ne.jp/progstudio/win_tips2.html

>>440
はい。CreateWindowExのlpParamに渡したインスタンス自身のポインタはGetWindowLongで受けとることができます。
勿論、lp->lpCreateParamsからも受け取ることができます。

>>441
コールバック関数からはインスタンスのアドレスが取れないそうです。
ですので、staticが付いているプロシージャとstaticが付いていないプロシージャがあるわけです。
この辺の理由について私にはよく分かりません。言語的な仕様なのかWindowsの仕様なのか。
Win32API質問箱 Build121 [転載禁止]©2ch.net
444 :デフォルトの名無しさん[sage]:2015/10/29(木) 17:26:21.42 ID:NLVhxZ3A
>>442
ベースとなる親ウィンドウについてはサブクラス化は必要なく
ウィンドウ内に配置するフォームやボタンなどの子ウィンドウについてはサブクラス化する必要がありますね。
そうしないと1つのプロシージャの中に全部のプロシージャを書かないといけなくなりますから。
ソースコードが読みづらくなりますし、そのことがバグの温床になりえるので。

1つのインスタンスでアプリケーション内のすべての子ウィンドウを管理するのは
一般的なアプリケーションで実装している方法ではないのかな?
Win32API質問箱 Build121 [転載禁止]©2ch.net
451 :デフォルトの名無しさん[sage]:2015/10/29(木) 23:14:44.05 ID:NLVhxZ3A
皆さんに大変申し訳ないんですが、アクセス違反の原因が判明致しました。

>>443の参照先のCBaseWnd::CallProc内の
//_thisポインタが取得できなかった場合...
   if( ! thisPtr )
この部分に該当する私が作成しているソースコードがif(thisPtr = NULL)になっていたのが原因でした。
本来ならif(thisPtr == NULL)ですね。
以前ポインタを使ったプログラムでif(!〜)で書くとうまく動かないケースがあったので
if(〜 == NULL)と書こうとしたところを打ち間違えていただけでした。大変失礼しました。

なんでデバッガの自動変数のthisポインタがいつも0(NULL)なんだろうと不思議に思っていたら・・・ですね。
質問の件のアクセス違反の問題は自己解決しました。

>>445>>448
ううう、SetWindowLongをコメントアウトしたらウィンドウを閉じてもIDEがデバッグ中のままですね。
それじゃあ、CreateWindowExのlpParamにセットしたthisポインタは一体なんなんだろう・・・。
2回同じthisポインタをセットしてることになりませんか?

>>446
それはですね、ベースのインスタンス内のコンテナに入れようかと思っています。
その場合もプロシージャが二段構成になるのでしょうか、面倒ですね。
こんなことしなくちゃいけないならプロシージャは普通の関数にした方がいいかもしれないですね。

>>447>>450
SetWindowSubclassは使ったことはあります。同じことがSetWindowLongでもできますけど。
GetWindowLongPtrは32bitと64bit両方対応できる書き方のようですね。

はい、質問の件は解決しちゃったのでこの質問はこれで閉じます。
スレの流れが意味不明ですみません。みなさん、ありがとうございました。


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。