- Explicit linking -
순수 C언어로만 구성해보자. 참고로 개발 도구는 다음과 같다.
(1) 컴파일러 : Intel Compiler 10.1.020
(2) 툴 : Visual Studio 2008 Team System 2008
1. DLL 파일
Visual Studio -> Console Program -> empty project
참고로 프로젝트명은 testDll 이다.
파일명은 testDll.c 로 하고 다음과 같이 적는다.
__declspec(dllexport) char *str = "THE TRUTH IS OUT THERE";
__declspec(dllexport) int adds(int a, int b);
int adds(int a, int b)
{
return a+b+10;
}
이렇게 소스 코드를 작성 후, 컴파일을 하자!
(순수 C언어로 컴파일 하기 위해 컴파일방법을 "C" 언어로만 하도록 바꾼다. 이는 Project->Properties->C/C++->Advanced
Compile as 메뉴에서 "Compile as C COde" 로 하자.)
그러면 testDll.dll 파일이 나온다.
(참고로 컴파일시 Project->Properties->General->Configuration type 에서 Dynamic Library 로 바꿔 주어야 한다.)
2. Dll 를 사용하는 소스
Visual Studio -> Console Program -> empty project
프로젝트명은 "test" 로 한다.
(여기서 주의점은 LoadLibrary 시 UNICODE 로 된 dll 파일명을 넘겨야 컴파일시 에러가 발생하지 않는데, 이를 위해서
_T() 매크로를 사용해서 넘겨야 한다. 문젠 이 _T 매크로를 사용하기 위해선 MFC 를 사용해야 한다.
따라서 이 예제에서는 어쩔 수 없이 순수 C가 아닌 C++ 로 컴파일을 대체해야 한다.
만약, 본인이 순수 C 를 이용해 _T() 매크로를 대체 할 수 있는 코드를 만들어서 테스트 해본 후 성공한다면 업데이트 할 것이다.)
test.cpp 파일을 등록하고 아래와 같이 코딩한다.
(주의 사항 : !! MFC 를 위해 <afx.h> 및 <afxwin.h> 를 사용할 텐데, 이는 반드시 <windows.h> 보다 위에 와야 한다.)
#include <afx.h>
#include <afxwin.h>
#include <stdio.h>
#include <windows.h>
int main(void)
{
//function pointer
int (*adds)(int, int);
// DLL Load
HMODULE hInst;
hInst = LoadLibrary(_T("testDll.dll"));
if(hInst==NULL) {
printf("failuressss \n");
return EXIT_FAILURE;
}
adds = (int (*)(int, int))GetProcAddress(hInst, "adds");
printf("sum %d \n",adds(4,6));
FreeLibrary(hInst);
return EXIT_SUCCESS;
}
컴파일을 한 후 생성되는 실행파일과 같은 디렉토리에 1번에서 만든 testDll.dll 파일을 함께 놓고 실행하면 결과가 나올 것이다.