C언어

메세지 크래커

고요한하늘... 2009. 8. 10. 17:05

윈도우즈 코드를 보다보니 평상시에 보기 힘든 코드가 있어서 간단히 소개를한다.

검색엔진에서 찾아보니 '메세지 크래커'라는 이름으로 사용을 하고 있습니다.

 

 

비주얼 스튜디오를 설치하면 windowsx.h라는 파일을 찾아볼수가 있는데 이 파일을 열어보면

 

/****** Message crackers ****************************************************/
#define HANDLE_MSG(hwnd, message, fn) \
case (message): return HANDLE_##message((hwnd), (wParam), (lParam), (fn))

 

이런 코드를 볼수 있다, HANDLE_MSG라는 define함수는 아래에 있는 HANDLE_WM_*으로 시작하는 다른 define함수를 호출한다.

 

/* void Cls_OnTimer(HWND hwnd, UINT id) */
#define HANDLE_WM_TIMER(hwnd, wParam, lParam, fn) \
((fn)((hwnd), (UINT)(wParam)), 0L)

 

 

코드설명을 간단히 하면

프로그래머는 HANDLE_MSG()라는  매크로로 정의된 함수를 사용하면 된다.

이 함수를 호출하면

HANDLE_MSG()의 두번째 인자 message에 따러서 그에 맞는 함수(fn)을 호출하는 방식이다.

 

이런식의 메세지 크랙커를 쓰는 이유는 간단하다.

 

함수 사용을 간단히 하기 위함이다. 서로 다른 파라미터를 갖는 여러 종류의 함수에 대해서 미리 define해놓고 이후에는 간단히 언제 호출하고(message) 그때 어떤 함수(fn)를 호출하는지를 설정만 하도록 한다.

 

간단히 예를 들면

#include <windowsx.h>

 

void called_a( char *b );

void called_b( int c, char *d );

void calling( int a, char *b, int c, char *d )

{

 

   switch( a )

   {

        case WM_A : called_a( b ); break;

        case WM_B : called_b( c, d ); break;

   }

}

 

 

만약에 calling()함수가 이렇게 되어 있다고 할때

switch문안에서 호출하는 called_a()와 called_b() 이 두 함수의 파라미터를 각각 알고 있어야 한다.

물론 다른 곳에서 이 함수를 호출할때에도 이 함수에서 필요로 하는 함수 파라미터의 개수와 종류를 알고 있어야 한다.

 

이를 간단히 메세지 크래커로 변경하면

 

#include <windowsx.h>

 

void called_a( char *b );

void called_b( int c, char *d );

void calling( int a, char *b, int c, char *d )

{

 

   switch( int a )

   {

        HANDLE_MSG( a, called_a ) ;

        HANDLE_MSG( a, called_b ) ;

   }

}

 

처럼 변경이 가능하다. HANDLE_MSG가 함수 이름이라고 생각하면

함수의 파라미터 개수는 항상 2이고 첫번째는 함수를 언제 호출할지 알리기 위함이고 두번째는 호출되는 함수명을 넣으면 된다.

 

한번만 메세지 크래커로 작업을 해 놓으면 이후에 함수를 호출하는 노력이 훨씬 줄어든다.

 

위 예에서 필요한 함수를 정의하면 다음과 같다.

#define HANDLE_MSG( message, fu ) \

case (message) : return HANDLE_##message( (b), (c), (d), (fn) )

 

#define HANDLE_WM_A( b, c, d, fn )\

((fn)((b))

 

 

#define HANDLE_WM_B( b, c, d, fn )\

((fn)((c),(d)))

 

 

'C언어' 카테고리의 다른 글

bit counting  (0) 2010.04.28
thread pool  (0) 2010.01.15
sendfile  (0) 2009.08.05
DOXYGEN & graphviz  (0) 2009.06.10
한글 putty  (0) 2009.04.20