GWL_WNDPROC で書き換えたプロシージャーコールで稀にクラッシュする件
次のコードを見てください。
OrgProc= (WNDPROC)GetWindowLong(hEdit, GWL_WNDPROC); SetWindowLong(hEdit, GWL_WNDPROC, (LONG)SEARCHWND); |
一見何の変哲もないサブクラス化によるプロシージャーコールの書き換えです。
ところが、これを書き換えたプログラムの最後で
return CallWindowProcW(OrgProc3, hDlg, message, wParam, lParam);
のように読み出すとごく稀にクラッシュすることがあります。
逆アセンブルしてトレースしてみたところ、lParam で割り当てられている一時変数などが、この処理に入ったところですでに解放されていることがある、という Windows か Visual Studio の不具合であることが分かりました。
たとえば、SETTEXT命令で 与えられる パラメータのテキストの内容が、実際の処理を行うときには解放されているのです。
: i=CallWindowProcW(OrgProc3, hDlg, message, wParam, lParam); return i; } int CALLBACK _OrgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam){ |
対策版コード
なぜかこれで落ちなくなったよ|;・ω・)
一応、try文も 書いたけど、実際に catch に飛ぶこともなくなりました
ちょっといやなバグですね
Comments