http://lmgtfy.com/?q=%ED%95%A8%EC%88%98%ED%8F%AC%EC%9D%B8%ED%84%B0
↑딱히 널 위해 해주는건 아니야

세상 살다보면 별일이 다 발생한다지만 코딩질 하다가 발생하는 난감함중 하나가 사용자(여기서 말하는 사용자는 내가 만든 dll이나 클래스 등을 사용하는 사람을 말한다.)가 만든 코드를 호출해야 할때입니다.

머....난감하다는 표현으로 하는 이유는 이런 방식은 내가 개발하고 있는 방향에서 반대로 간다고 생각하기때문이지 별다른 뜻이 있는건 아닙니다. ㅎㅎ(한마디로 심각하게 개인적인 견해라는 말씀)


 
1.함수포인터 콜백
이런 경우 흔이 쓰는 방법이 함수포인터를 이용한 콜백입니다.( CallBack )
(닷넷에서는 델리게이트를 통해 구현 할수 있저.)

몬소리냐하면

1. 클래스(dA) 내부에 사용자가 만든 함수의 포인터(dB)를 저장해둘 변수(?)를 만든다.
2. 사용자가 함수(uF)를 만든다.
3. 사용자는 클래스(uI)를 생성한후 자신이 만든 함수(uF)를 함수포이터저장변수(dB)에 넣는다.
4. 클래스(dA) 내부에서 함수포이터저장변수(dB)를 호출한다.
5. 결과적으로 사용자가 함수(uF)가 호출된다.

그림으로 표현하자면


요렇게 되겠습니다.


 
1-1. 개발자 프로그램
내가 만들어서 배포할 프로젝트의 코드입니다.


 
1-1-1.claTest.h

class dA
{
public:
	//함수포인터 저장용
	void (*dB) (char *s);

	//함수 포인터 호출용
	void dC(char *a);
};


 
1-1-2. claTest.cpp

#include "claTest.h"

void dA::dC(char *a)
{

	//사용자 함수 호출
	dB(a);
}


 
1-2. 사용자 프로그램
내가 만든 dll을 가저다 쓸 사용자의 프로그램입니다.
(여기서는 테스트 프로그램이 되겠군요.)


 
1-2-1. 선언부

//사용자 함수 만들기
//이 함수는 테스트용이기 때문에 별도의 출력코드를 넣지 않았다.
//a=1;에 중단점을 걸고 *s에 값이 들어왔는지 함수가 호출됬는지만 확인하면 된다.
//절대 귀찬아서 그런거 아니다 ^^;;;;
void uF(char *s)
{
	int a;
	a=1;
}
 
 
1-2-2. 클래스 생성 및 호출

//클래스 인스턴스 선언
dA* uI;

//클래스 인스턴스 생성
uI = new dA();

//함수 등록
uI->dB = uF;

//함수 호출
uI->dC("콜백해서 온거다 냥");


 
2.결과확인
이제 uF에 중단점을 걸고 걸고 실행해보겠습니다.


클래스 함수를 호출했으나 사용자 함수가 잘 호출된 모습을 볼수 있다.

테스트를 위해서 char*을 사용했는데 선언한 함수모양만 맞쳐주면 동작합니다.

void (*dB) (char *s, int i);
요런 것도 가능하저

이 예제 코드에서는 예외처리가 없습니다. 함수포인터 저장용 변수를 생성할때 NULL로 초기화 해놓고 널이면 예외 처리를 하던가 하는 방법으로 해주어야 예상치 못한 에러를 막을수 있습니다.

함수 콜백은 은근이 여기저기서 많이 쓰이니 잘사용하시길 ㅎㅎ
그럼 잘쓰시길 ㅎㅎ



  1. Favicon of http://pigwangd.tistory.com BlogIcon 지잡대생 2011.07.12 03:08 신고  Address  Edit/Delete  Reply

    와 이건 몬말인지 모르겠다 -_- ㅋㅋ
    dll을 쓰기 위해서 열고 어쩌고 하는건가봐요

    • Favicon of http://blog.danggun.net BlogIcon 당근천국 2011.07.12 03:40 신고  Address  Edit/Delete

      이정도 급되면 c++중급정도 된겁니다 ㅎㅎㅎ
      이해못해도 괜찬은거조 ㅎㅎ

      dll에서 외부의 함수를 호출하기 위한 방법입니다.

      dll은 한번 빌드해서 나가면 수정이 불가능합니다.
      그렇기 때문에 사용자가 dll과 합께 자신의 함수를 돌리고 싶으면 저런 방법으로 사용할수 있게 인터페이스를 재공해야 합니다.

  2. Favicon of http://felab.tistory.com BlogIcon 돼지 2011.07.12 10:41 신고  Address  Edit/Delete  Reply

    ㅋㅋㅋ 저는 C++은 학점 C++받은 몸이라 잘 모르겠네요
    저의 시험 공부는 stdio.h iostream.h 어쩌고 저쩌고가 끝이었음.

    시험 문제에 테트리스 코드주고 틀린부분을 모두 찾고 이유를 쓰고 올바르게 고치고 빈칸을 메꾸고 뭐 이딴게 나와서 c+받았어요. 그래도 교과서에 있는 예제는 다 만들줄 아는데 ㅠ

    • Favicon of http://blog.danggun.net BlogIcon 당근천국 2011.07.12 13:25 신고  Address  Edit/Delete

      헐헐 그렇군요 ㅎㅎㅎ

      저의 과는 공퓨터공학과였는데도 불구하고 학생의 80%는 C++포기하더라고요 ㅡ.-;;
      더 웃긴건 전공필수였저 ㅎㅎㅎㅎ

      대부분은 프로그래밍 언어가 c를 모티브로 하고 있어 C와 C++은 해두는편이 좋다고 하는데....컴공조차 저 랬을 정도니까요 ㅎㅎㅎ OTL

      어차피 이바닥에 전공자는 30%뿐 ㅡ.-;

댓글 작성

이름
패스워드
홈페이지
비밀글

티스토리 툴바