- 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両方対応できる書き方のようですね。 はい、質問の件は解決しちゃったのでこの質問はこれで閉じます。 スレの流れが意味不明ですみません。みなさん、ありがとうございました。
|