SSKK 2008. 10. 3. 12:47

Dll이 처음 메모리에 로드되면 DllMain()이라고 하는 진입점(entry-point) 함수가 호출된다.

DllMain() 함수는 다음과 같은 구조를 갖는다.

 

BOOL APIENTRY DllMain( HINSTANCE hModule, DWORD dwReason, LPVOID lpReserved)

{

switch(dwReason){

case DLL_PROCESS_ATTACH:

// DLL 이 프로세스의 주소 영역에 매핑됨

// DLL 초기화 코드

break;

case DLL_THREAD_ATTACH:

// 스레드가 생성됨

break;

case DLL_THREAD_DETACH:

// 스레드가 종료됨

break;

case DLL_PROCESS_DETACH:

// DLL 이 프로세스의 주소 영역에서 매핑이 해제됨

// DLL 종료 처리 코드

break;

}

}

 

흥미로운 것은 DLL을 로드한 프로세스가 새로운 스레드를 생성할 때도 DllMain() 함수가 호출된다. 이 경우에는 dwReason 인수에 DLL_THREAD_ATTACH 값이 전달된다. 마찬가지로 DLL을 로드한 프로세스가 생성된 스레드를 소멸시킬 때도 DllMain() 함수가 호출되면 이 경우에는 DLL_THREAD_DETACH 값이 dwReason 인수에 전달된다.

참고 : 전병선의 Component Development with Visual C++ & ATL