술텀뱅이 블로그

CallBack 함수란? 본문

Language/C

CallBack 함수란?

우럭망둥이 2011. 3. 7. 11:49
흠...
우선 질문자의 기본지식이 어느정도인지 알아야 그에 맞는 답변을 하겠지만
여기서 등장하는 용어들이 Windows프로그래밍에 사용되는
개념들이므로 기본적으로 C를 알고있다는 가정하에 답변을 하겠습니다.

-사실 본인도 DirectX 조금씩 건드려보고 있는 초짜 Windows programmer입니다.
답변을 완벽히 할만큼의 지식은 지니지 못했으나 복습하는 의미로 몇자
적어보죠.



1.WinMain() 함수

간단하게 답하면 C언어의 프로그램 진입점(즉 실제로 프로그램을 실행하면
여기서 부터 순차적으로 수행된다고 볼수 있습니다.)이 main()함수입니다.
이와 마찬가지로 Windows 응용 프로그램을 작성시 실제 프로그램이 수행되는
시작지점이 이 WinMain()입니다.



2.CallBack함수

CallBack함수는 의미상으로 자동으로 호출되는 함수입니다.
여기서 자동이란 의미는 사용자가 명시적으로 호출하지 않는다는 뜻이죠.

그럼 명시적인 호출의 간단한 예를 들자면

void main()
{
...
printf("abc\n");

}
즉, 사용자가 어느 시점에 이 printf()란 함수가 수행되는지 알수있습니다.
-엄밀히 말하면 실행되는 시간을 말하는것 보단 실행 순서를 알수 있죠.


그러나 CallBack 함수의 경우는 호출할 시점을 알수가 없는데
말 그래로 자동으로 이 함수를 필요에 의해 누군가가(?) 호출하기 때문입니다.

C에 익숙한 프로그래머라면 이해가 잘 되지 않을텐데
이것에 대해 확실히 알려면 Windows 동작 구조에 대한 기반 지식이 필요 합니다.

너무 길어질것 같아 간단히 얘기하면
-windows 동작 구조에 대한 정보를 담고있는 책이나 사이트들은 상당히
많으니 자세한 설명은 그곳에서 보십쇼.

C에서는 프로그래머가 작성한 코드의 순서대로 프로그램이 진행되지만

main()
{
FunA();
FunB();
FunC();
...
}

이런식으로

하지만 Windows프로그램의 경우는 그와는 좀 다릅니다.
역시 예를 들어보죠.

만약 사용자가 Windows에서 어떤 Key를 눌렀다고
가정해 봅시다. 이때 key를 누른 사건(?)을 windows(OS)에선 이벤트(event)가
발생했다고 합니다. 그러면 windows에선 이 사건(event)를 파악한뒤에
(어떤 키를 눌렀는지 조사하는 등)
메시지(Message)라는 형태로 바꾼후 '시스템 큐'(system Queue - 쉽게 말해서
이 메시지들을 저장할수 장소라고 보면됩니다.)에 저장이 됩니다.
그런후에 어떤 프로그램에게 그 입력(키를 눌렀는지)을 한것인지를 조사해
그 프로그램이 자체적으로 갖고있는 메시지 저장소(아까 말한 system Queue는
windows에서 관리하는 메시지 저장소이고 이것은 각 응용 프로그램마다
별도로 관리하는 메시지 저장소 입니다.)로 그 메시지를 보냅니다.
그 다음에야 드디어 '윈도우 프로시져'라는 CallBack함수가 등장합니다.
아까 메시지를 받았던 응용 프로그램은 이 메시지를 처리해야 합니다.
뭐 그 프로그램이 메모장이라면 누른 key가 메모장에 적혀지겠죠.
이런식의 처리를 해야하는데 이때 이 처리 기능 역할
을 하는 함수를 윈도우 프로시져(windows procedure)라 합니다.

그렇다면 여기서 언제 window procedure가 호출되는지 알수 있겠습니까?
물론 위의 설명에선 Message(이벤트)가 발생할때에 호출된다고 볼수도 있지만
그건 프로그램상에서 명시적 직접 호출한것이 아닌 메시지가 발생함에 따라
'자동'으로 호출된겁니다.

그럼 간단한 윈도우 프로시져함수롤 보도록합시다.

LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
switch (iMsg)
{
case WM_DESTROY :
ReleaseDraw (hwnd) ;
PostQuitMessage (0) ;
return 0
case WM_KEYDOWN:
....
....

return 0;
}
return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
}

이것이 일반적으로 WinApi32(쉽게 Windows program)에서 사용하는
window procedure라는 Call Back함수입니다.
아까 예에서 Key를 눌렀을시 어떤 메시지가 발생한다고 했는데
그때 발생하는 것이 WM_KEYDOWN이라는 메시지입니다.

'Language > C' 카테고리의 다른 글

ansi C 에 정의된 함수 목록  (1) 2011.03.07
strlen  (2) 2011.03.07
C의 여러가지 단어  (1) 2011.03.07
배열 선언 오류  (2) 2011.03.07
after Normal Block error  (2) 2011.03.07
Comments