|
답변이 없어서 다시 올립니다.
시스템 전체에 keyboard hooking 프로그램을 제작 중인데, 한가지 의문점이 생겨서 고수님들의 고견을 듣고자 글을 올립니다.
아래 소스와 같이 dll을 동적으로 연결(LoadLibrary 이용해서)할 경우, Lock_KBD의 설치는 정상적으로 이루어지나, 이벤트가 발생하면 프로그램이 죽습니다.
그러나, 이를 정적으로 연결(lib를 실행프로그램에 포함, 소스도 정적으로 변경)하여 처리하면 아무런 이상없이 정상적으로 동작합니다. 또한 동적연결로 만든 dll을 델파이에서 호출하여 사용하여도 이상없이 잘 동작합니다. C++ Builder의 버그가 아닌가 생각도 됩니다. (제가 사용하는 컴파일러는 C++ Builder 5 Enterprise입니다)
제가 원인을 분석한 결과는 HInstance가 application이나 library 자체를 지시하는 handle이지, dll을 지시하지 않는다는 결론에 도달하였습니다. 그래도 왠지 찝찝한 기분.
[참조 : 도움말의 내용] HInstance contains the instance handle of the application or library as provided by the Windows environment.
제가 분석한 것이 맞는지 ? 맞다면 HInstance를 대신하여 dll을 동적으로 연결하여 처리할 수 있는 방법은 없는지요 ?
dll source ------------------------------------------------------------------
//bool __export Lock_KBD (void);
//bool __export Unlock_KBD (void);
HHOOK ghLook_KBD;
HHOOK ghShellHook;
const char *gHookDFile = "hook.dat";
long __stdcall Hook_Look_KBD (int code, WPARAM wParam, LPARAM lParam)
{
if ( ghLook_KBD == 0 ) ReadData ();
if ( code >= 0 ) return (long)true;
return CallNextHookEx (ghLook_KBD, code, wParam, lParam);
}
//---------------------------------------------------
// Lock Keyboard function
extern "C" __export __stdcall bool Lock_KBD (void)
//bool Lock_KBD (void)
{
bool result = false;
// hook keyboard for full system
// HInstance : application, lib 자체를 지시하는 handle (dll을 지시하지는 않음)
ghLook_KBD = SetWindowsHookEx (WH_KEYBOARD, (HOOKPROC) Hook_Look_KBD, HInstance, 0); <= 문제의 HInstance
result = (bool) ghLook_KBD;
WriteData ();
return result;
}
//---------------------------------------------------
// Unlock Keyboard function
extern "C" __export __stdcall bool Unlock_KBD (void)
//bool Unlock_KBD (void)
{
if ( ghLook_KBD == 0 ) ReadData ();
return UnhookWindowsHookEx (ghLook_KBD);
}
//---------------------------------------------------
program source --------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
/*
if ( Lock_KBD () )
{
Button1->Enabled = false;
Button3->Enabled = true;
}
*/
bool (__stdcall* Lock_KBD)(void);
HINSTANCE hInst;
bool r;
hInst = LoadLibrary ("hookDll.dll");
Lock_KBD = (bool (__stdcall*)(void)) GetProcAddress (hInst, "Lock_KBD");
if ( Lock_KBD )
if ( Lock_KBD () )
{
Button1->Enabled = false;
Button2->Enabled = true;
}
FreeLibrary (hInst);
}
|