Programming Language/C++

LRESULT / CALLBACK / WPARAM / LPARAM

알 수 없는 사용자 2017. 7. 9. 04:09

(2014년에 네이버 블로그에서 작성했던 글을 티스토리로 옮기며 이관했습니다)

 

 

 

Win32 API 경험자라면 LRESULT CALLBACK Func(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); 형태의 콜백 함수를 많이 보셨을 겁니다.

 

의미를 알기 쉬웠던 HWND(핸들), UINT(unsigned int)를 제외한 키워드들이 어떤 의미를 함축하고 있는지 알아보겠습니다.

 

1. LRESULT

 

LRESULT은 이렇게 선언돼 있습니다.

1
2
#typedef long LONG_PTR
#typedef LONG_PTR LRESULT
cs

 

 

long 과 같습니다. 왜 typedef로 재정의가 되었냐면 개발 시 리턴값임을 명시해 주기 위해서입니다.

 

 

2. CALLBACK

 

CALLBACK은 호출규약입니다.

LRESULT와 마찬가지로 어떻게 선언돼 있는지 확인해 보겠습니다.

1
#typedef CALLBACK __stdcall
cs

 

 

표준 호출 규약입니다. 즉, 파라미터를 스택에 쌓아서 함수를 호출하고, 쌓인 파라미터들을 함수가 리턴되기 전에 정리합니다.

- MSDN: https://msdn.microsoft.com/ko-kr/library/zxk0tw93.aspx

 

 

 

3. WPARAM, LPARAM

 

WORD PARAMETER, LONG PARAMETER의 약자로, OS에서 콜백 함수를 호출할 때 부가적으로 주는 메시지를 가지는 변수들입니다.

WPARAM은 WORD형이라고 오해할 수도 있는데 사실 unsigned int형입니다. LPARAM은 의미 그대로 long형이고요.

 

현재는 두 값 다 4바이트인데, 예전 16Bit 환경에서는 int가 2바이트였습니다.

그래서 wParam은 주로 상태를 나타내는 플래그나 간단한 값을 전달할 때 쓰였고, lParam은 좌표 등의 2바이트의 크기로는 나타내기 힘든 값이나 포인터를 전달할 때 사용되었습니다.