C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[26186] 머리가 무지 아플텐데..
수야!╋ [sooya23] 760 읽음    2003-07-02 13:56
간단히 알려드릴께요.

1. 프로그램 내부에 콜백을 받을 수 있는 함수를 정의한다.

2. DLL 을 로딩한후 GetProcAddress 함수를 호출하면서 해당 콜백 함수의 포인터를 넘긴다.

3. DLL 내부에서 1번에서 선언했던 콜백함수와 같은 형태의 함수형을 선언한다.

4. 3번에서 선언한 함수형을 변수와 같이 선언한 후 2번에서 넘긴 포인터를 대입한다.

5. DLL 내부에서 원하는 이벤트가 발생시 3번에서 선언한 함수를 호출한다.

위의 방법으로 DLL과의 콜백 구현이 끝이 납니다.

순서만 알려드린거구요 아래부터가 진짜입니다.


프로그램 내부 코딩해야되는 부분입니다.

해더파일에 선언할 부분입니다.

typedef void (__fastcall *콜백함수)(char *수야); // 1번 이야기중 하나입니다.


class 내부에 선언할 부분입니다.

콜백함수 DLL에서주는놈; // 2번 이야기중 하나입니다. 4번과 혼동하실수 있습니다만 같은이야기입니다.


CPP파일에 선언할 부분입니다.

void __fastcall DLL에서 콜백하는 함수(char *수야) // 1번 이야기의 핵심입니다.
{
  // 이곳에서 char로 선언된 수야라는 변수를 가지고 노시면 됩니다.
  // 수야란 놈은 DLL에서 호출할 프로그램받아라()라는 함수의 인자값으로 넘긴 값입니다.
  // 주의사항은 __stdcall 로 선언해버릴경우 콜백함수로 그 역활을 다 해낼 수 없습니다.
  // 자세한 이유는 모르겠네요
}

DLL을 로딩하는 부분입니다.

HISTANCE 디엘엘 = loadlibrary("a.dll'); // 님이 선언하셨던 부분으로

DLL에서 주는놈 = (콜백함수) GetProcAddress(디엘엘, "디엘엘에서 선언된 함수");
// 디엘엘에서 선언된 함수라는것은 DLL을 로딩하면서 이런 저런 설정을 해주게 되는데요
// 디엘엘에서 선언딘 함수 라는함수 안에는 4번 작업이 이루어져야 합니다. 잊지마세요!
// 님의 예제 소스에서는 logtext라는 함수가 그 역활을 할 것 같군요

DLL에서 주는놈(DLL에서 콜백하는 함수); // 2번 이야기의 핵심입니다.


a.dll 안에 선언된 DLL에서 선언된 함수 라는 함수의 내부를 보면 이런식일겁니다.

typedef void (__fastcall *프로그램한테주는함수)(char *수야); // 3번의 핵심입니다.
프로그램한테주는함수 프로그램한테보내; // 함수의 포인터라는 계념입니다. 이해못하시면 안되요

export C __stdcall DLL에서 선언된 함수(프로그램한테주는함수 보내자);
{
  프로그램한테보내 = 보내자; // 4번의 핵심입니다.
}

마지막 남은건 5번이군요

원하시는 부분에서 프로그램한테보내() 를 호출하시면 프로그램으로 콜백으로 가게됩니다.

한글로 코딩해서 보기가 좀 힘드신가요? 답변을 드릴때는 그게 제 특기라서 ㅡ_ㅡ;

이해가 안가실 수 있을겁니다.

계속 물어보세요

여기저기서 답변 주실겁니다.

추가적으로 문법이 100% 맞지는 안습니다. ( 특히 DLL안에 함수 선언부 )

C++은 한글로 코딩 할 수 없습니다. (주석문은 가능하지만요)

좋은 하루되세요

답변이 좀 올라왔으면 좋으련만..






이미경 님이 쓰신 글 :
:
: 안녕하세요... 학교숙제?하다가 막혀서 염치 불구하고
: 제발 욕하지 마시고 좀 봐주세요...
:
: 저 dll 안에서 메세지가 발생했을때 호출한 프로그램에서 어떻게 가져올수 없나요?
: (콜백함수로요....)
: 예를들어
:
: [a.dll 안에서....]
: int abc(unsigned char *S)
: {
: .....
: logtext("current data:\n%s", S);
: .....
: }
:
: int adcd(unsigned char *S)
: {
: .....
: logtext("current data:\n%s", S);
: .....
: }
:
: [호출한 프로그램]
: ....
: loadlibrary("a.dll');
: .....
: dll 안에서 메세지가 발생(logtext)했으때 바로 리턴..
: 콜백으로 해야 한다고 하는데...
:
: 도와주세요...
: 염치불구하고 간단한 예제라도 주시면... 너무 도움이 될것같아요...
:
:
:

+ -

관련 글 리스트
26169 [질문]오빠들! 좀 도와주세요... 이미경 884 2003/07/01
32699     Re:[질문]오빠들! 좀 도와주세요... 수야!╋ 801 2003/07/01
32698     Re:[질문]오빠들! 좀 도와주세요... 수야!╋ 809 2003/07/01
26186     머리가 무지 아플텐데.. 수야!╋ 760 2003/07/02
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.