반응형

요즘은 소프트웨어를 개발시 주프로그램과 독립적이면서 작은 기능을 수행하는 여러 작은프로그램을 분리해서 개발하게 됩니다. 작은 프로그램은 보통 dll(dynamic link library) 형태로 구현하며, 주프로그램과 소스상에서 분리되며 실행시 주프로그램과 동적으로 연결되게 됩니다.

소스상에서 이둘의 통신은  함수호출을 통해서 이루어집니다.

dll은 외부에서 자신의 기능을 사용할수 있도록 호출가능한 함수들을 제공합니다. 반대로, 주프로그램은 외부에서 호출할수 있는 함수들을 제공하지 않습니다.

 


 

만일, 주프로그램이 DLL에게 어떠한 작업요청을 한후, 이 작업이 완료되었을때 DLL로 부터 응답을 받고 싶은 경우가 생겼다고 하면 어떻해야 할까요?

이 경우, 주프로그램은 외부에서 호출가능한 함수를 제공하지 않으므로, 호출받고 싶은 함수의 포인터를 DLL에 넘겨준후, DLL에서 호출하도록 구현해야 합니다.

 

다음은 dll에 주프로그램내 호출될 함수포인터의 등록과 dll에서 함수포인터 호출에 대한 간단한 소스입니다.

 

dll 내부

 

//registerfuncptr.h

long DECLSPEC__ __cdecl  SetCallbackProcAddr(long fuctionPtr, int type);

void (*successfptr)(); //함수포인터 선언

void (*failfptr)();

 

//registerfuncptr.c

#include "registerfuncptr.h"

// 함수포인터 등록
long DECLSPEC__ __cdecl  SetCallbackProcAddr(long fuctionPtr, int type)
{
  long Result    = 0;
  if(type == 1)
  {
   successfptr = fuctionPtr;
   if(successfptr != NULL)
      Result = 1;
  }
  else if(type == 2)
  {
   failfptr= fuctionPtr;
   if (failfptr!= NULL) 
    Result = 1;
  }

  return Resul;

}

 

//함수포인터 호출

void work() {

...

   // 작업성공

  if(bState)

     (*successfptr)();

   //작업실패

   else

      (*failfptr)();

}

 

 

주프로그램

 

//response.h

void register();

void success();

void fail();

 

//response.c

void register()

{

   SetCallbackProcAddr((long)(&success)   ,1);

   SetCallbackProcAddr((long)(&fail)   ,2);

}

 

void success() {

...

}

 

void fail() {

...

}


반응형

+ Recent posts