DLLMain에서 하지 말아야 할것.

by Lyn posted Jan 12, 2012
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄

DLLMain은 WinMain 이나 main 과는 다르게 제약이 많다.

나도 이걸로 크래시 낸 적이 많이몇번 있고 ... 


DLLMain은 일종의 "객체의생성자" 라고 보면 비슷하다.

"로딩중" 인 것이지 로딩이 끝난것이 아니다 라는것이다.


아래에는 Attach 시 기준으로 적었지만, Detach 에도 별 다를건 없다. kerner32.dll 이외의 dll은 이미 언로딩 되어있을 수도 있다.


이제 하지 말아야할것을 슬~슬 나열 해 보자. 


1. kernel32.dll 이외의 dll에 있는 함수 대부분.

kernel32.dll 이외의 dll이 로딩되어 있다는 보장은 전혀없다


2. 동기화코드

락, 언락 등의 코드


3. LoadLibrary, CreateProcess

다른 DLL 쓰지말라는말과 일맥상통. 


4. 전역객체 초기화, 메모리할당 등

메모리메니저가 로딩되었다는 보장이 없다


5. COM관련 코드

역시 보장없다


6. 예외 throw

C++ 객체 생성자에서 throw 하는것과 비슷한 대략므흣한 (...) 상황이 발생한다.


결론. 

DLLMain은 걍 비워 둬라. 그리고 Initialize 함수를 제공해라.
상당수의 라이브러리가 라이브러리 초기화 함수를 제공하는것은 다 이유가 있다!

(당장 GDI+와 Winsock2를 생각해봐라!)