-
LRESULT / CALLBACK / WPARAM / LPARAMProgramming Language/C++ 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은 이렇게 선언돼 있습니다.
12#typedef long LONG_PTR#typedef LONG_PTR LRESULTcs long 과 같습니다. 왜 typedef로 재정의가 되었냐면 개발 시 리턴값임을 명시해 주기 위해서입니다.
2. CALLBACK
CALLBACK은 호출규약입니다.
LRESULT와 마찬가지로 어떻게 선언돼 있는지 확인해 보겠습니다.
1#typedef CALLBACK __stdcallcs 표준 호출 규약입니다. 즉, 파라미터를 스택에 쌓아서 함수를 호출하고, 쌓인 파라미터들을 함수가 리턴되기 전에 정리합니다.
- 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바이트의 크기로는 나타내기 힘든 값이나 포인터를 전달할 때 사용되었습니다.
'Programming Language > C++' 카테고리의 다른 글
인라인 함수 (0) 2017.08.08 [Win32 API] 윈도우 모니터 중간으로 위치 이동하기 (0) 2017.08.08 [Win32 API] 다이얼로그 아이콘 변경 (0) 2017.08.08 __cdecl, __stdcall 차이점 (2) 2017.01.02 C++ 템플릿 클래스는 언제 생성될까? (0) 2016.12.10