:: ADVANCE ::
[LRESULT] LRESULT & CALLBACK 본문
[LRESULT] LRESULT & CALLBACK
윈도우 라이브러리를 이용한 영상처리를 할 때
콜백 함수를 보면 반환형이 LRESULT이다.
그렇다면 LRESULT와 CALLBACK이라는 데이터형은 무엇일까
윈도우 프로시저를 보면 LRESULT와 CALLBACK이라는 데이터형이 존재한다.
LRESULT는 long type으로 Win32환경에서 메세지 처리를 마친 후 운영체제에게 신호를 주기 위해 사용하는 값이다.
즉, LRESULT는 윈도우 프로시저에서 반환되는 데이터형
CALLBACK은 FAR PASCAL을 재정의한 것으로, 콜백루틴이나 프로시저에서 사용한다고 책에 나온다.
비주얼 C++에서 보면 LRESULT는 다음과 같이 선언되어 있다.
#define LRESULT LONG
long의 리턴값을 사용하지 않고 굳이 LRESUL라고 재선언하는 이유는
이 값이 리턴값임을 좀 더 명확하게 나타내기 위한 프로그래머의 의도라 생각된다.
결국 LRESULT로 반환되는 값은 long값이지만 꼭 숫자일 필요는 없다.
long은 4byte 변수이므로 LRESULT에 포인터를 캐스팅해서 반환해도 무관하다.
(포인터 역시 4byte의 변수이므로)
대부분의 윈도우 프로그램에서는 LRESULT 값으로 객체의 포인터를 반환하는 것을 자주 볼 수 있다.
CALLBACK은 FAR PASCAL의 다른 이름이다.
FAR 은 원거리 포인터임을 나타내는 것이고,
PASCAL은 함수 호출규약을 나타내는 것이다.
프로그래밍 내에서 함수호출이라는 것은 그 함수의 시작 포인터로 점프하는 것을 의미하고,
또 윈도우에서는 가상 메모리 주소를 사용하므로 대부분의 함수 진입부가 원거리 포인터라는 뜻이다.
(하지만 윈도우 95 이상에서는 원거리 포인터와 근거리 포인터의 구분이 없으므로 FAR이라는 것은 무시해도 된다.)
아무튼,
자세한 설명은 참고 사이트를 이용하고
FAR PASCAL을 CALLBACK이라고 선언하여 사용한다.
이 함수가 CALLBACK 함수로 사용됨을 프로그래머가 명시하기 위한 것이다.
즉, 자신이 짠 함수는 윈도우에서 CALLBACK되어 불리어지는 함수라는 것을 명시하는 것이다.
즉, CALLBACK은 호출 함수의 스택에 쌓아두었던 데이터를 복원하여 사용하는 함수임을 명시하는 것이다.
[참고] http://ds3grk.tistory.com/7
[참고] http://skmagic.tistory.com/entry/API-HRESULT%EC%99%80-LRESULT
[참고] http://cafe.daum.net/_c21_/bbs_search_read?grpid=fruV&fldid=PJMu&datanum=19
'Image Processing > Windows Programming' 카테고리의 다른 글
[MFC] Dialog based MFC 기본 영상처리 window 만들기 (1) | 2015.12.18 |
---|---|
[error] LINK2005 이미 정의되어 있습니다. (0) | 2015.12.18 |
[DC] DC (Device Context) (0) | 2015.12.17 |
[CALLBACK] CALLBACK Function (0) | 2015.12.17 |