콜백함수 구현하기

음 밑의 글이랑 같은 작업을 하는중…

Engine 이란 DLL에서는 될수 있으면 MFC관련 코딩을 최대한 지울려고 노력중이다.(될수있으면 WIN32도 없애야 나중에 편할듯..)
그런대 Engine 으로 옮기는 코드중에 theApp 객체를 이용해서 현재 프로그램의 진행상황을 출력해주는 루틴이 있었다.

뭐 exe에 있을때야 편하구나~ 하고 사용했지만 -_-;;
일단 주석처리를 해놓고 DLL로 옮겨 놓고나서 생각을 해보니 출력은 둘째치고 라고 분명 exe에서는 dll에서 처리되고 있는 상태를 알수 있어야 한다.

dll에서 exe로 정보를 넘기는 방법에 대해서 생각을 해봤는데
1. exe쪽에서 theApp 객체를 넘겨서 DLL에서 출력루틴을 호출
2. 윈도우 메세지를 이용해서 DLL에서 exe의 윈도우쪽에 메세지를 보내 exe에서 출력루틴을 호출
3. dll에서 exe쪽에 변수포인터를 넘기고 이 변수를 통해 진행상황을 공유. (이 경우는 exe쪽에서 일정시간마다 변수의 변화값을 체크)

일단 생각나는건 이 세가지였다.
1번의 단점은 MFC코드가 들어간다는 점과 theApp(아니면 다른객체) 의 출력루틴이나 객체가 변경된다면 DLL을 수정해줘야 하는 어이없는 상황이 생긴다.
장점은 DLL쪽에서 호출하게 되니깐 exe쪽에서는 출력에 관한 사항을 신경쓸 필요가 없다는것
2번 단점은 역시 API관련 코딩이 된다는것. 그리고 윈도우객체에서 처리해야 한다는것.
3번의 단점은 exe에서 귀찮은 코드가 많이 들어간다는것. 장점은 dll에서는 신경쓸 필요가 없다는것.

3가지다 그다지 좋은 코드가 아니라고 생각이든다.
이리저리 머리를 굴리다가 생각한것이 함수포인터를 이용해서 DLL에서 exe가 호출을 원하는 함수를 호출하게 하는것이다.
1번 방법과 유사하지만 함수의 형태를
void Function(void* )
의 형태로 고정해 두고 필요한 정보는 구조체로 만들어 void*로 넘겨주게 한다.

요약하면 DLL에서 호출시점과 정보만을 넘겨주고 실제 MFC코드를 사용해서 출력하는 루틴은 EXE에서 실행되는것이다.

이렇게 하면 exe에서 호출되는 시점에 대한 신경을 쓸필요없이 정확하게 호출되고 DLL에는 API나 MFC코드도 들어가지 않는다.

음… 내심 좋은 방법이야~ 이러고 있었는데 생각해보니 WIN32의 콜백함수와 똑같은 방법이다. 그냥 윈도우 프로그래밍 책볼때는 “음 그런가 보군.” 하고 넘어갔었는데 실제로 머리를 굴려가며 생각해서 구현해보니 역시 뭔가 다른 느낌이다.

http://lagoons.net/wiki/wiki.php/CallBackFunction 에 해당 내용에 대해서 정리해 봤다.(크아 이거 쓰는데 1시간 걸렸어!. 글로 설명하려니… 내가 처했던 그 상황을 설명하기가 정말 어렵다.)