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){
    int i;
    try{
        i=(CallWindowProcW(OrgProc, hDlg, message, wParam, lParam));
    }
    catch(...){
        i=0;
    }
    return i;
}

対策版コード

なぜかこれで落ちなくなったよ|;・ω・)
一応、try文も 書いたけど、実際に catch に飛ぶこともなくなりました

ちょっといやなバグですね

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です