명시적 DLL 연결

명시적 링킹

-함수 포인터 변수 선언                        (예, void (*MyFuc) (char *); )

-hDLL=LoadLibrary("dll 이름")

-pF=GetProcAddress(hDLL,"함수이름")

-함수 포인터 변수 할당                       (예, MyFuc=(void (*) (char *))(pF); )

-함수 실행                                        (예,MyFuc("DLL TEST"); )

-FreeLibrary(hDLL);

 

DLL 프로그램 빌드(c 프로그램)
// mydll.h header file 내용
#define LIBSPEC __declspec (dllexport)
LIBSPEC void MyPrintf(char *);

 

// mydll.c source file 내용
#include <stdio.h>
#include "mydll.h"

LIBSPEC void MyPrintf(char * tmp)
{
 printf(tmp);
}

==> 빌드하면 mydll.dll, mydll.lib 생성됨.

 

응용프로그램 빌드(c, c++ 프로그램)

#include <stdio.h>
#include <windows.h>

int main(int argc, char* argv[])
{
 HINSTANCE hDLL;
 FARPROC pF;
 void (*MyFuc) (char *);                                    // 함수포인터 선언

 

 hDLL=LoadLibrary("mydll.dll");
 if(hDLL==NULL)
 {
  printf("\nFailed to load dllc.dll");
  return 1;
 }
 
 pF=GetProcAddress(hDLL,"MyPrintf");                // DLL파일에서 불러올 함수의 포인터를 얻어온다
 if(pF==NULL)
 {
  printf("\nFailed to find entry point");
  return 1;
 }

 

 MyFuc=(void (*) (char *))(pF);                          // 함수포인터와 DLL 함수와의 연결

 

 MyFuc("DLL TEST");                                       // 일반 함수 사용하듯이 사용

 

 FreeLibrary(hDLL);

 return 0;
}

 

==> mydll.dll 파일만 카피하여 실행.


 명시적 연결의 경우 lib 파일이 없기 때문에 정확히 어떤 함수를 불러와야 되는지 모를때가 있다.
 이 경우 dumpbin 명령을 사용하면 쉽게 값을 얻어올 수 있다.(dumpbin은 커맨드 명령어이다.)

 ex) dumpbin /exports 사용할dll파일명.dll

 결국 dll 파일을 명시적으로 사용할때 가장 중요한 부분은 불러올 함수의 함수 포인터를 선언하고
연결하는 부분이다. 일단 그렇게 연결만 시킨다면 일반 함수 사용하듯이 사용할 수 있다.

by 미류 | 2008/03/03 14:48 | 프로그래밍 | 트랙백 | 덧글(0)

트랙백 주소 : http://miryu17.egloos.com/tb/1482054
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]

:         :

:

비공개 덧글

◀ 이전 페이지          다음 페이지 ▶