システムフックしているDLLが終了しない・・・


茶太郎  2010-01-25 01:48:10  No: 71307  IP: 192.*.*.*

助けてください!

メインのDLL(以下メインDLL)からフックするDLL(以下フックDLL)を呼び出しているのですが、メインDLLの  DLL_PROCESS_DETACH  内でUnhookWindowsHookExを実行してメインDLLを終了してもフックDLLが終了しません。。

以下ソースです
---------------------------------------------------------------------------------------------
メインDLL
BOOL WINAPI DllMain(HINSTANCE hModule,
                      DWORD ul_reason_for_call,
                      LPVOID lpReserved)
{
  switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:            
         SetHook()
         break;
    case DLL_PROCESS_DETACH:
     
     while(HookState()){
       FreeHook();
     }
     break;
  return TRUE;
}

---------------------------------------------------------------------------------------------
フックDLL
#pragma data_seg( "DLL_HOOK" )
HHOOK    hHookWnd=0;
#pragma data_seg()

HINSTANCE hInst; 
UINT    MassageTEST;

LRESULT CALLBACK  MyCallWndProc(int nCode,WPARAM wParam,LPARAM lParam)
{
  if(((CWPRETSTRUCT *)lParam)->message==対象メッセージ){
    //処理
    return 0;
  }
  return CallNextHookEx( hHookWnd, nCode, wParam, lParam );
}

BOOL SetHook(UINT argc,HINSTANCE callprocesshInst)
{
    WndMassageTEST = argc;

  hHookWnd=SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)MyCallWndProc, hInst, 0);
  if(hHookWnd==NULL){
    return FALSE;
  }else{
    return TRUE;
  }

}

void FreeHook(void)
{
  UnhookWindowsHookEx(hHookWnd);
  hHookWnd = NULL;
}

BOOL HookState(void)

{
    return (hHookWnd) ? TRUE : FALSE;
}

BOOL WINAPI DllMain(HINSTANCE hModule,
                      DWORD ul_reason_for_call,
                      LPVOID lpReserved)
{
  hInst = hModule;
  return TRUE;
}

編集 削除
茶太郎  2010-01-25 01:55:16  No: 71308  IP: 192.*.*.*

↑ソースがインデントされてなくてすみません!
開発環境を忘れてました。。

OS:vista
IDE:Visual C++ 2008 Express Edition

です

編集 削除
aetos  2010-01-25 09:59:09  No: 71309  IP: 192.*.*.*

終了しないとは、具体的にどういう現象で、どうやって確認したのですか?

編集 削除
茶太郎  2010-01-25 11:20:03  No: 71310  IP: 192.*.*.*

具体的には、
メインDLLはjavaのJNAで呼び出されるのです。
メインDLLはVBのアプリからウィンドウメッセージを受け取るのですが、
GetMessage()が上手く動作せず(メッセージが届いても戻ってこない)、
SPYXXで確認したところ、メインDLLのウィンドウプロシージャーが
利用不可能となっていました。
VB側のPostMessage()は成功しているので、キューには届いているはずなのです。

それでシステムフックを使うことにしました。
フックDLLを使ってシステムフックをしたところ、VBが投げたウィンドウメッセージを受け取ることが出来ました。
しかし、その後、フックDLLが終了しなくなりました。
フックDLLをビルドし直して、入れ替えようとしたところ、使用中?のメッセージが出てしまい
いったんログオフしてからでないと、入れ替えられない状態なのです。

編集 削除
茶太郎  2010-01-25 11:26:00  No: 71311  IP: 192.*.*.*

すみません↑のソースが正確ではありませんでした。。
SetHook関数が、以下のようになります。

OOL SetHook(UINT argc,HINSTANCE callprocesshInst)
{
    WndMassageTEST = argc;//RegisterWindowMessage()で登録したメッセージ
//callprocesshInstは、メインDLLのインスタンスです。
hHookWnd=SetWindowsHookEx(WH_CALLWNDPROC(HOOKPROC)MyCallWndProc,callprocesshInst, 0);
      if(hHookWnd==NULL){
            return FALSE;
      }else{
            return TRUE;
      }
      return 0;
}

上記のようにしたところ、ウィンドウメッセージを受け取ることが出来るようになりました。

編集 削除
茶太郎  2010-01-25 11:53:08  No: 71312  IP: 192.*.*.*

MSDNでSetWindowsHookExを確認したところ、
HINSTANCE は、lpfnパラメータが指すフックプロシージャを保持している DLL のハンドルを指定します。とありました。
ですので、現在はメインDLLとフックDLLをまとめて一つのDLLになっています。
そして、SetHook()とFreeHook()をjava側で行うようにしました。

ウィンドウがオープンしたイベントで、SetHook()
ウィンドウがクローズしたイベントで、FreeHook()

をするようにしました。。が、eclipseが落ちたり、エクスプローラーが落ちたり、色々落ちてもう散々です・・・

編集 削除