フック解放時の挙動がよく分からない

金糸雀オンリーの時に出した新作アプリ(フックしてごにょごにょするモノ)なんですが、特定のアプリケーションのみ終了時に落ちるという状況が発生しています。

トレースしてみたところ……(あ、前提として、グローバルにデストラクタ付きのオブジェクトAが1個配置されています。)

  1. アプリケーションを終了する。
  2. Hook DLL - DllMain が Process Detach で呼ばれる。
  3. DllMain が return し _DllMainCRTStartup に戻る。
  4. オブジェクトAのデストラクタが呼ばれる
  5. フックプロシージャが呼ばれる
  6. すでに解放済みのオブジェクト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);

  :
  :
  :
}