.dll 과 .lib 의 차이점[S1]
1. Library
라이브러리란 함수, 데이터, 타입 등 여러가지 프로그래밍 요소들의 집합
- 같은 프로그래밍 코드를 작성할 필요를 제거하여 개발을 빠르게 할 수 있도록 함
1.1 static link
- .lib
- 링크할 때 lib 파일을 포함하여 실행파일을 만듬
- 메인실행파일의 크기가 커짐, 소스레벨에서 재사용 가능
1.2 dynamic link
- .dll
- 메인 실행파일에 포함되어 있지않고 독립적으로 존재
- 실행프로그램을 구동 시 필요할 때 마다 불러다 씀
- 메인실행파일의 크기가 작음, 프로그램 실행 속도 빨라짐
1.2.1 dll의 종류
- 일반 DLL : C++, 파스칼, 비베 등 다른 환경에서도 사용가능한 범용 DLL
C함수 형태로 만들어져야함. 클래스나 오버로딩된 함수를 라이브러리 형태로 만들수 없음
- 확장 DLL : 클래스나 오버로딩 된 함수도 라이브러리 형태로 외부프로그램에서 사용 가능(MFC에서만)
1.2.2 dll의 인수(__declspec(dllimport) 원형;
- 라이브러리 만들 때 : dllexport
- 라이브러리 사용시 : dllimport
- Naked.. 나중에 찾아보기
1.2.3. dll 작성법
- 엔트리 포인트 필요없음(main, win main etc), 있긴 있음(dllmain)
- HINSTANCE, DWORD, LPVOID 타입를 전달해 줍니다..
이 함수가 실행되는건 4가지 조건이 발생했을때 호출이 되는데
DWORD에 호출 사유를 전달받으면 그에 따른 처리를 해주면 됩니다..
DLL_PROCESS_ATTACH - DLL이 로드 될 때
DLL_PROCESS_DETACH - DLL이 삭제 될 때
DLL_THREAD_ATTACH - DLL을 사용하는 프로세스에서 스레드를 생성할때
DLL_THREAD_DETACH - DLL을 사용하는 프로세서에서 스레드가 종료될때
각각의 값에 따라 처리를 해주면 됩니다
1.2.4. dll 빌드
- dll 빌드하면 dll 파일 과 lib 파일 생성
1.2.4.1 dll 파일
- 묵시적 연결(암시적implict 연결) :
a. 컴파일 시 로드할 라이브러리를 미리 정의,
b. __declspec(dllimport) 원형; 지정
c . lib 를 링커에 추가(보통 비주얼 스튜디오에선 프로젝트 속성->링커 쪽에 링크옵션 추가하는 부분 찾어서 넣어주면 됩니다..)
d. 링커 추가 후에 일반 함수 쓰듯이 사용
- 명시적(Explicit) 연결[S2] : 실행파일이 DLL이 있어야만 실행 가능
a. 자체적으로 읽을 라이브러리를 지정해서 로드
b. 명시적 연결에는 기본적으로 3가지 함수가 사용되는데
라이브러리 로드할때 사용하는 LoadLibrary(읽을 파일) - 읽은 파일의 핸들을 리턴,
라이브러리에서 함수를 읽는 GetProcAddress(라이브러리 핸들, 함수명) - 함수 포인터 리턴,
읽은 라이브러리를 더이상 사용 안할서 해제할때 쓰는 FreeLibrary(라이브러리 핸들) - bool 리턴
[S2]명식적 연결을 사용할때는 기본적으로 함수 포인터를 사용하는 방법을 알고 있어야 합니다..
사용법은 함수 포인터로 함수를 호출하는 방식이 묵시적 연결하곤 좀 틀리죠..
참고로 LoadLibrary로 dll을 읽을때 윈도우는 해당 dll의 카운트를 증가시킵니다..
FreeLibrary로 dll를 해제할땐 카운트는 하나 줄이죠..
결국 카운트가 0이되어야 해당 dll이 메모리에서 삭제되므로 이 둘은 쌍으로 사용해 줘야
OS의 메모리 낭비를 막을수 있답니다..
'개발 > c++' 카테고리의 다른 글
entry point must be defined (0) | 2015.01.02 |
---|---|
DLL 관련 URL (0) | 2015.01.02 |
Visual Assist X 10.9.2052.0 download patch crack va_x.dll (0) | 2014.12.31 |
개발자 천국 홈피 (0) | 2014.12.31 |
Whole Tomato Visual Assist (0) | 2014.12.31 |
댓글