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
[15911] [질문] 고수님의 고견 부탁드립니다. keyboard hooking dll 내의 HInstance에 대하여
^^ [] 1474 읽음    2002-02-28 13:25
답변이 없어서 다시 올립니다.

시스템 전체에 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);
}



+ -

관련 글 리스트
15911 [질문] 고수님의 고견 부탁드립니다. keyboard hooking dll 내의 HInstance에 대하여 ^^ 1474 2002/02/28
15915     Re:[질문] 고수님의 고견 부탁드립니다. keyboard hooking dll 내의 HInstance에 대하여 꼴(이성렬) 988 2002/02/28
15924         Re:Re: HInstance는 LoadLibrary에서 리턴하는 DLL인스턴스 핸들입니다. [냉무] 꼴(이성렬) 1823 2002/03/01
16114             Re:Re:Re: 감사합니다. [냉무] ^^ 769 2002/03/08
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.