フック解放時の挙動がよく分からない
金糸雀オンリーの時に出した新作アプリ(フックしてごにょごにょするモノ)なんですが、特定のアプリケーションのみ終了時に落ちるという状況が発生しています。
トレースしてみたところ……(あ、前提として、グローバルにデストラクタ付きのオブジェクトAが1個配置されています。)
- アプリケーションを終了する。
- Hook DLL - DllMain が Process Detach で呼ばれる。
- DllMain が return し _DllMainCRTStartup に戻る。
- オブジェクトAのデストラクタが呼ばれる
- フックプロシージャが呼ばれる
- すでに解放済みのオブジェクトAにアクセス -> 落ちる
という状況なのは分かったんですが… なんで解放したハズのDLL内の関数を呼び出してくるんでしょうか。 そして、何で呼び出しに成功し 且つ 関数の実行が成功しているんでしょうか…^^;
呼び出しに成功しているということは、DLLは生きてるって事なんでしょう。 …が、グローバルに配置されているオブジェクトのデストラクタは CRT から呼ばれていると考えると、DLLとしては解放モードに向かっていると言うことだべ…?
というか、Process Detach した DLL に突入してくるというのが正直よく分からず…うーん。何なんだろう。
追記 : 対応方法
結局、Process Detach を受信したらフラグを立てて、それ以降 HookProc に飛んで来たものは「帰れ帰れ! おまえの出番じゃねーんだよ!」という対応にしました。
こんな感じ。 …えぇのかなぁコレで…^^;
LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam) { // カエレ! if(g_bProcessDetach) return ::CallNextHookEx(g_hHook, nCode, wParam, lParam); : : : }