C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[15883] [질문] 고수님의 고견 부탁드립니다. keyboard hooking dll 내의 HInstance에 대하여
^^; [] 875 읽음    2002-02-27 19:10
시스템 전체에 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을 동적으로 연결하여 처리할 수 있는 방법은 없는지요 ?

+ -

관련 글 리스트
15883 [질문] 고수님의 고견 부탁드립니다. keyboard hooking dll 내의 HInstance에 대하여 ^^; 875 2002/02/27
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.