http://blog.naver.com/guriis/40002401420
내가 설명하는 것 보단 훨씬 좋기 때문이다. 물론 난 글을 잘 못쓴다.
DLLs for Beginners.Doc 문서는 첨부 했다.
Static Linking(정적 링크)
C, Pascal, FORTRAN와 같은 고 수준의 프로그래밍 언어들에서는, 실행가능한 파일을 생성하기 위해서 응용프로그램의 소스 코드를 컴파일하고 다양한 라이브러리에 링크한다. 이러한 라이브러리들은 메모리를 할당하거나 숫자의 제곱근을 계산하는 것과 같은 일반적인 작업을 수행하기 위해서 호출되는 미리 컴파일된(precompiled) 함수들의 개체(object) 파일을 포함한다. 이러한 라이브러리 함수들이 응용프로그램에 링크될 때, 그것들은 응용프로그램 실행파일에 영구적으로 속하는(permanent) 부분이 된다. 그 라이브러리 함수에 대한 모든 호출은 링크 시간에 결정된다(resolved) - 즉 그 이름은 정적 링크(static linking)이다.
Dynamic Linking(동적 링크)
동적 링크는 실행시간에 응용프로그램이 라이브러리를 링크하는 메커니즘을 제공한다. 그 라이브러리들은 자체의 실행 파일에 존재하며, 응용프로그램의 실행 파일에 정적 링크처럼 복사되지 않는다. 이들 라이브러리들은 동적 링크 라이브러리(DLL)라고 불리우는데, 그것들이 로드되고 실행될 때가 그것이 링크되었을 때가 아니라 응용프로그램에 링크되었을 때임을 강조한 것이다. 응용프로그램이 DLL을 사용할 때, 운영 체제는 DLL을 메모리로 로드하고, DLL 안의 함수들에 대한 참조를 결정한다. 그래서 그것들은 응용프로그램에 의해 호출될 수 있으며, 더 이상 필요하지 않을 때 DLL은 언로드될 수 있는 것이다. 이 동적 링크 메커니즘은 응용프로그램이나 운영체제에 의해서 명시적으로 수행될 수 있다.
1. File에서 New를 선택해서 Project 탭을 선택한다.
2. 프로젝트 타입 목록에서 Win32 Dynamic-Link Library를 선택한다 .
3. 적절한 프로젝트명을 기입하고, Finish.
이제 DLL을 위한 기본적인 프로젝트 파일이 만들어진 것이다
4. cpp 및 헤더 파일 생성은 알아서 해라.
5. def 파일은 File-New-C/C++HeaderFile 을 선택하고 파일명 기입시 확장자를 입력하면 된다.
MyDLL.cpp
#include <windows.h>
BOOL WINAPI DllEntryPoint(HINSTANCE hDll, DWORD dwReason, LPVOIDReserved)
{
switch(dwReason)
{
case DLL_PROCESS_ATTACH:
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
이것은 이 DLL을 사용하는 프로그램들이 이 DLL을 로드하면 DllEntryPoint()가 자동으로 호출이 되는 것이다. 그리고 위의 코드는 switch ~ case 문으로 구성이 되어있다. DLL_PROCESS_ATTACH는 DLL이 EXE에 로딩될 때, 실행된다. 그러므로 초기화에 관련된 코드는 이 곳에 넣어주면 된다. 또한 DLL_PROCESS_DETACH는 DLL이 EXE 파일에서 해제될 때 실행된다. 그러므로 이 부분엔 DLL을 사용하는 EXE 파일이 종료되기 직전에 실행될 부분을 넣어주면 된다.
int MyFunc(int a, int b)
{
return a*b;
}
int CdeclFunc(int a)
{
return 2*a;
}
MyDLL.h
int MyFunc(int a, int b);
int CdeclFunc(int a);
MyDLL.def
EXPORTS
MyFunc
CdeclFunc
-------------------------------------------------------------------
EXE 프로그램 작성
1. File에서 New를 선택해서 Project 탭을 선택한다.
2. 프로젝트 타입 목록에서 Win32 Console Application 를 선택한다 .
3. 적절한 프로젝트명을 기입하고, Finish
APP.cpp
#include <windows.h>
#include <stdio.h>
void main()
{
typedef int(*lbFunc1)(int);
typedef int(*lbFunc2)(int, int); // 포인터 함수 사용
int x = 3;
int a = 3;
lbFunc2 Func2;
HINSTANCE hLibrary;
hLibrary = LoadLibrary("MyCPP.dll"); //Load DLL in main
if( hLibrary == 0 ){ //HINSTANCE handle를 얻음
printf( NULL, " Load rfm Library failed.", 0 );
exit(0);
}
Func2 = (lbFunc2)GetProcAddress(hLibrary, "MyFunc"); // 함수 얻음.
if(Func2 == NULL){
printf( NULL, " Load CMyFunc failed.", 0 );
exit(0);
}
a = ((Func2)(x,a));
printf("%d", a);
FreeLibrary(hLibrary); //Free Library in main
}
dll 파일은 Exe 실행파일이 있는곳에 복사 해야 된다. /Debug 밑이나 /Release밑에 복사 하면 된다.
더 이상 태클 걸지 마라. 나도 찾아서 알아 낸 거다.
'운영체제 & 병렬처리 > DLL_LIB' 카테고리의 다른 글
directx 릴리즈,디버그 lib (0) | 2012.11.02 |
---|---|
lib 파일 생성과 사용 (0) | 2012.11.01 |
|DLL 분석 ①|DLL파일 생성과 설명 (0) | 2012.11.01 |
종속성에 의한 lib 가 변경될때마다 복사하지 않는 방법 (0) | 2012.11.01 |
dll과 lib 배포하기 (0) | 2012.11.01 |