'엔트리'에 해당되는 글 1건
- 2009.04.27 DllMain
2009. 4. 27. 11:43
DllMain
2009. 4. 27. 11:43 in Programmings/Windows Programming
DLL은 함수들의 집합이므로 함수에 대한 정의만 있으면 되고 일반적인 실행파일의 WinMain과 같은 메인함수가 꼭 있어야 하는것은 아니다. 엄밀히 말하자면 DLL도 반드시 Main이라는 엔트리포인트가 필요하지만, VC++를 사용할 경우 C런타임이 엔트리 포인트를 대신 제공하기 때문에 없어도 상관이 없다는 것이다.
DLL이 단순한 함수의 집합이 아니라면 DLL의 엔트리 포인트 DllMain이 필요하다. 전역변수가 있다거나 동적으로 메모리를 할당해 사용한다거나 할 때 초기화와 종료 처리를 위해 필요하다.
BOOL WINAPI DllMain(HINSTANCE hInst, DWORD fdwReason, LPVOID lpRes);
hInst는 DLL의 인스턴스 핸들이다.
fdwReason은 이 함수가 호출된 이유를 지정한다.(일종의 통지 메시지)
DLL_PROCESS_ATTACH
- DLL이 프로세스의 주소공간에 맵핑될 때 호출된다.
주로 메모리를 할당하거나 시스템 전역 핸들을 초기화하는 용도로 사용된다.
DLL_PROCESS_DETACH
- DLL이 프로세스의 주소 공간에서 분리될 때 호출된다.
할당한 메모리를 해제하거나 시스템 전역 핸들을 파괴하는 용도로 사용된다.
DLL_THREAD_ATTACH
- DLL을 사용하는 프로세스에서 스레드를 생성할 때마다 이 값과 함께 DllMain함수가 호출된다.
DLL에서는 이 값을 받았을 때 스레드별 초기화를 수행한다.
DLL_THREAD_DETACH
- DLL을 사용하는 프로세스에서 스레드가 종료될 때마다 이 값과 함께 DllMain 함수가 호출된다.
DLL에서는 이 값을 받았을 때 스레드별 종료 처리를 한다.
lpRes는 DLL의 연결 방식을 지정한다.
TRUE - 암시적 연결
FALSE - 명시적 연결
BOOL WINAPI DllMain(HINSTANCE hInst, DWORD fdwReason, LPVOID lpRes)
{
switch(fdwReason) {
case DLL_PROCESS_ATTACH:
...
break;
case DLL_PROCESS_DETACH:
...
break;
case DLL_THREAD_ATTACH:
{
switch(fdwReason) {
case DLL_PROCESS_ATTACH:
...
break;
case DLL_PROCESS_DETACH:
...
break;
case DLL_THREAD_ATTACH:
...
break;
case DLL_THREAD_DETACH:
...
break;
}
return TRUE;
}
break;
case DLL_THREAD_DETACH:
...
break;
}
return TRUE;
}
이런 식으로 구현을 해주면 된다.
해당하는 통지 메시지가 전달 될 때 필요한 작업을 넣어준다. 가만히 보고 있자면 하는 일이 WndProc와 비슷한것 같다면서.. ^^;
'Programmings > Windows Programming' 카테고리의 다른 글
GetWindowThreadProcessId() (0) | 2009.05.18 |
---|---|
GetModuleFileNameEx() (0) | 2009.05.15 |
DLL 제작 (Explicit) (0) | 2009.04.24 |
DLL 제작 (Implicit 연결) (0) | 2009.04.23 |
DLL 이란... (0) | 2009.04.23 |