掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
システムフックで使用したDLLを開放するには? (ID:53346)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
この掲示板で助言を頂き、VBからDLLを使ってシステムフックを行い、 他のアプリの状態を監視する事が出来ました。 私のプログラムがマズいのか、VBのEXEを閉じてDLLを削除しようとすると、 〜 を削除できません。アクセスできません。送り側のファイルが使用中の可能性があります。 と言われてしまいます。友人はFreeLibraryを使えば?と言うのですが、どうもウマクいきません。それともシステムフックの場合開放は無理なのでしょうか?OSはWIN2000です。 '-------------------------------------------------- VB側 '-------------------------------------------------- Private Sub Form_Load() Call sethook End Sub Private Sub Form_Unload(Cancel As Integer) Call freehook End Sub '-------------------------------------------------- DLL側 '-------------------------------------------------- #define STRICT #include <windows.h> #define DllExport __declspec( dllexport ) #define CLASS_NAME "ThunderFormDC"//開発ツール //#define CLASS_NAME "ThunderRT6FormDC"//実行ファイル #define TITLE_NAME "777" #define MESSAGE "777" DllExport void CALLBACK sethook(void); DllExport void CALLBACK freehook(void); HWND g_lng_aaa; COPYDATASTRUCT g_udt_CDS; //共有領域 #pragma data_seg(".sharedata") /*フックプロシージャハンドル 共有領域のデータは初期化しないとうまく確保されない*/ HHOOK hHookWnd=0; #pragma data_seg() HINSTANCE hdll; //BCでは『DllEntryPoint』 BOOL WINAPI DllMain (HINSTANCE hInstance, DWORD reason, LPVOID lpReserved) { g_lng_aaa = FindWindow(CLASS_NAME,TITLE_NAME); (void)lpReserved; if(reason==DLL_PROCESS_ATTACH) { hdll=hInstance;//DLLハンドル保存 } return TRUE; } LRESULT CALLBACK CallWndProc(int nCode,WPARAM wParam,LPARAM lParam) { //メッセージを処理する必要があるか? if(nCode == HC_ACTION){ if(((CWPSTRUCT *)lParam) -> message == WM_CREATE) { char str_aaa[512]; char str_bbb[256]; GetClassName(((CWPSTRUCT *)lParam) -> hwnd,str_aaa,256); GetWindowText(((CWPSTRUCT *)lParam) -> hwnd,str_bbb,256); strcat(str_aaa,"■"); strcat(str_aaa,str_bbb); g_udt_CDS.dwData = 0; g_udt_CDS.lpData = (void*)str_aaa; g_udt_CDS.cbData = lstrlen(str_aaa) + 1;//終端のNULLも送信 SendMessage(g_lng_aaa,WM_COPYDATA,(WPARAM)NULL,(LPARAM)&g_udt_CDS); } } return CallNextHookEx(hHookWnd, nCode, wParam, lParam);//次のフック } //フック設定 void CALLBACK sethook(void) { hHookWnd=SetWindowsHookEx(WH_CALLWNDPROC,CallWndProc, hdll, 0); } //フック解除 void CALLBACK freehook(void) { UnhookWindowsHookEx(hHookWnd); }
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.