|
시스템 전체에 keyboard hooking 프로그램을 제작 중인데, 한가지 의문점이 생겨서 고수님들의 고견을 듣고자 글을 올립니다.
참고로 제가 사용하고 있는 컴파일러는 C++ Builder 5.0 Enterprise입니다.
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);
}
이와같이 dll을 동적으로 연결할 경우, Lock_KBD의 설치는 정상적으로 이루어지나, 이벤트가 발생하면 프로그램이 죽습니다. 그러나, 이를 정적으로 연결(lib를 실행프로그램에 포함, 소스도 정적으로 변경)하여 처리하면 아무런 이상없이 정상적으로 동작합니다. 또한 동적으로 처리되는 dll을 Delphi에서 호출하여 처리하여도 이상이 없습니다.
제가 원인을 분석한 결과는 HInstance가 application이나 library 자체를 지시하는 handle이지, dll을 지시하지 않는다는 결론에 도달하였습니다 (제 생각에는 C++ Builder 컴파일러의 버그가 아닐까 생각합니다). 그래도 왠지 찝찝한 기분.
[참조 : 도움말의 내용] HInstance contains the instance handle of the application or library as provided by the Windows environment.
제가 분석한 것이 맞는지 ? 맞다면 HInstance를 대신하여 dll을 동적으로 연결하여 처리할 수 있는 방법은 없는지요 ?
|