삽질의 현장/- 윈도우 시스템

#033_WIndow_System_DLL (3)

shovelman 2015. 10. 1. 15:46


안녕하세요 삽잡이입니다.


이번 시간에는 지난 시간에 이어서 DLL에 대하여 조금 더 알아보려고 합니다.


DLL에도 메인이 있습니다.



우리가 아는 main은 한번 실행이 된 다음 종료가 되면 프로그램이 종료되지요...

그런데, DLL의 main은 성격이 다릅니다.

DllMain은 DLL이 어떤 상태인지 파악하려고 호출되는 네가지 case를 가지고 있습니다.

즉, 네가지 case가 될 때마다 호출이 되는 것입니다.


DLL의 초기화, 마무리를 위해 만들어진 것이 DLL의 메인이지요...


물론, DLL을 만들었을때 왜 안썼느냐 할 수있는데,

초기화, 마무리를 할 때 할일이 없다면 필요가 없겠지요...

하지만, DLL을 load할 때 메모리가 필요하고, Unload할 때 메모리를 해제해야한다면...

DLL이 load,되고 unload 되는 시점에서 해야하는데,

그런 것을 이제 DLL main에서 정의해놓는 것입니다.


DLL_PROCESS_ATTACH는 프로세스에 load 될 때,

DLL_PROCESS_DETACH는 DLL이 프로세스에서 Unload 될 때

발생하는 case 입니다.


그리고, 해당 DLL을 사용하는 영역이 받아질 때마다, 

쓰레드가 죽어서 DLL을 사용하지 않을 때 


DLL_THREAD_ATTACH와 DLL_THREAD_DETACH case가 발생합니다.


물론, .Net에서는 DLL의 용도가 달라져서 별로 중요하지 않지만,

예전부터 사용하던 개념이다... 정도만 이해하시길 바랍니다.



아무튼...

Client에서 Server의 내용물을 가져오는 방법은 두 가지 방법이 있다고 했습니다.

1. 명시적인 연결

2. 암묵적인 연결

이와 같이 말입니다.


그런데 Class는 명시적인 연결이 아닌, 암묵적인 연결만을 사용할 수 있습니다.


Class를 외부에서 쓰도록 하고 싶다면,

앞에 _declspec(dllexport)처럼 명시를 해줘야합니다.

즉, 외부에서 이 DLL을 사용할 수 있도록 노출시키겠다는 뜻이지요...


그런데 Class에서 사용할 때에는 생각을 좀 더 해봐야합니다...

지난 시간에는 헤더가 클라이언트가 쓸 수 있도록 만들어 놓은 파일로써

클라이언트 입장에서 사용하다보니 import를 사용했었는데요,

Class는 클라이언트에도, DLL 내에서도 가져다 써야하는 상황이 있습니다...


DLL 입장에서는 export가 맞고... 클라이언트의 입장에서는 import를 하는것이 맞구요...

따라서 헤더를 두개 준비해야하는데... 불편하니 메크로를 사용합니다...



DLL에서는 [속성]>[전처리]에서 정의를 해주면 export가 될 것이고...

외부에서 쓸때에는 전처리에 정의가 되있지 않으니 import가 되겠지요...


 


DLL에서는 전처리 처리를 했으니까 정보를 알고 있을 것 아니겠습니까...


이 DLL을 클라이언트가 사용할 때에는 

반드시 5개의 경로중 하나에 있어야합니다.


1. 실행 파일이 있는 디렉토리

2. 작업 디렉토리 (현재 디렉토리)

3. 시스템 티렉토리 (System32)

4. Windows Root (Windows - Window가 설치되어 있는 디렉토리)

5. Path 디렉토리


이와 같은 순서로 디집니다(?)... 허허...


DLL은 대부분 공유하기 때문에.... 이렇게 찾는다고 하네요...

이 곳 외에 있으면 못찾는 것이구요...


여기까지 알아보도록 하겠습니다...


이상 삽잡이였습니다!



'삽질의 현장 > - 윈도우 시스템' 카테고리의 다른 글

#033_WIndow_System_DLL (2)  (0) 2015.09.30
#032_WIndow_System_DLL (1)  (0) 2015.09.30
#031_WIndow_System_힙(Heap)  (0) 2015.09.30
#030_WIndow_System_메모리 맵 파일  (0) 2015.09.30
#029_WIndow_System_IPC_파이프(2)  (0) 2015.09.30