助けてください!
メインの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;
}
↑ソースがインデントされてなくてすみません!
開発環境を忘れてました。。
OS:vista
IDE:Visual C++ 2008 Express Edition
です
終了しないとは、具体的にどういう現象で、どうやって確認したのですか?
編集 削除具体的には、
メインDLLはjavaのJNAで呼び出されるのです。
メインDLLはVBのアプリからウィンドウメッセージを受け取るのですが、
GetMessage()が上手く動作せず(メッセージが届いても戻ってこない)、
SPYXXで確認したところ、メインDLLのウィンドウプロシージャーが
利用不可能となっていました。
VB側のPostMessage()は成功しているので、キューには届いているはずなのです。
それでシステムフックを使うことにしました。
フックDLLを使ってシステムフックをしたところ、VBが投げたウィンドウメッセージを受け取ることが出来ました。
しかし、その後、フックDLLが終了しなくなりました。
フックDLLをビルドし直して、入れ替えようとしたところ、使用中?のメッセージが出てしまい
いったんログオフしてからでないと、入れ替えられない状態なのです。
すみません↑のソースが正確ではありませんでした。。
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;
}
上記のようにしたところ、ウィンドウメッセージを受け取ることが出来るようになりました。
MSDNでSetWindowsHookExを確認したところ、
HINSTANCE は、lpfnパラメータが指すフックプロシージャを保持している DLL のハンドルを指定します。とありました。
ですので、現在はメインDLLとフックDLLをまとめて一つのDLLになっています。
そして、SetHook()とFreeHook()をjava側で行うようにしました。
ウィンドウがオープンしたイベントで、SetHook()
ウィンドウがクローズしたイベントで、FreeHook()
をするようにしました。。が、eclipseが落ちたり、エクスプローラーが落ちたり、色々落ちてもう散々です・・・