2008년 11월 12일
DLL
출처 : http://synch3d.com/wiki/moin/moin.cgi/DLL
라이브러리
라이브러리
라이브러리로 두가지 종류가 있다. 정적링크(Static Link)와 동적링크(Dynamic Link)로 두가지로 나뉜다.
정적링크는 컴파일시 라이브러리의 코드를 실행 파일에 복사하고 동적링크는 실행 중에 라이브러리에 있는 함수를 호출 하는 방법이다.
DLL
DLL은 동적링크를 사용하여 실행시에 함수가 정해진다.
사용 카운트(usage count)라는 것을 통해 사용시에 카운트가 증가하고 종료시에 카운트가 감소한다.
사용된 DLL파일을 찾을 때 먼저
1.클라이언트 프로그램의 디렉토리
2.윈도우즈의 시스템 디렉토리
3.PATH 환경 변수가 지정하는 모든 디렉토리
순서로 찾는다.
선언
__declspec (extended-attribute) declarator
함수에 대한 정보를 제공하는 선언문
extended-attribute
thread
TLS(thread local storage)데이터로 지정 한다. 이 지정자가 붙은 변수는 해당 쓰레드에서만 사용 가능하다.
naked
접두(prolog), 접미(epilog)를 생성 시키지 않는다. 어셈블리 언어를 사용하여 직접 접두, 접미를 달고자 할 때 사용한다.
가상 디바이스 드라이버를 작성할 때 이 기억 부류를 사용한다. 함수에만 적용되며 변수에는 적용 되지 않는다.
dllimport
DLL에 있는 데이터, 오브젝트, 함수를 임포트 한다. DLL에 있는 이렇게 생긴 함수를 앞으로 사용하겠다는 선언이다.
dllexport
DLL에 있는 데이터, 오브젝트, 함수를 엑스포트 한다. DLL을 사용하는 클라이언트(실행 파일이거나 또는 DLL)에게 DLL의 정보를
명시적으로 제공하는 역할을 한다.
extern "C"
C++ 의 언어의 특성상 오버로드와 같은 경우 다른 언어에는 없는 특성이다. 이와 같은 C++이 공개하는 함수 정보를 mangled name
이라고 하는데 위의 선언은 mangled name을 사용하지 않아 다른 언어에서도 사용하게 하겠다는 선언이다.
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved ) ;
DWORD ul_reason_for_call,
LPVOID lpReserved ) ;
ul_reason_for_call
DLL_PROCESS_ATTACH
DLL_PROCESS_ATTACH
DLL이 프로세스 주소 공간에 맵핑될 때 호출된다. 묵시적 호출일때 프로세스 시작될 때, 명시적 호출일때
LoadLibrary가 리턴되기 전에 이 값과 함께 DllMain이 호출될 것이다. 주로 메모리를 할당하거나 시스템 전역
핸들을 초기화 하는 용로도 사용된다.
DLL_PROCESS_DETACH
LoadLibrary가 리턴되기 전에 이 값과 함께 DllMain이 호출될 것이다. 주로 메모리를 할당하거나 시스템 전역
핸들을 초기화 하는 용로도 사용된다.
DLL_PROCESS_DETACH
DLL이 프로세스 주소 공간에서 분리될 때 호출된다. 묵시적 호출일 경우 프로세스 종료될때, 명시적 호출일때
FreeLibrary함수에 의해 이 값과 함께 DllMain이 호출된다. 할당한 메모리를 해제하거나 시스템 전역핸들을
파괴하는 용도로 사용된다.
DLL_THREAD_ATTACH
FreeLibrary함수에 의해 이 값과 함께 DllMain이 호출된다. 할당한 메모리를 해제하거나 시스템 전역핸들을
파괴하는 용도로 사용된다.
DLL_THREAD_ATTACH
DLL을 사용하는 클라이언트 프로세스에서 스레드를 생성할 때마다 이 값과 함께 DllMain함수가 호출된다. Dll에서는
이 값을 받았을 때 스레드별 초기화를 수행해야 한다. 단 이 값은 이미 존재하는 스레드에 대해서는 전달되지
않으며 스레드가 새로 만들어질 때만 전달된다. 또한 최상위 스레드는 DLL_PROCESS_ATTACH가 대신 전달되므로
이 값이 전달될 필요가 없다.
DLL_THREAD_DETACH
이 값을 받았을 때 스레드별 초기화를 수행해야 한다. 단 이 값은 이미 존재하는 스레드에 대해서는 전달되지
않으며 스레드가 새로 만들어질 때만 전달된다. 또한 최상위 스레드는 DLL_PROCESS_ATTACH가 대신 전달되므로
이 값이 전달될 필요가 없다.
DLL_THREAD_DETACH
DLL을 사용하는 클라이언트 프로세스에서 스레드가 종료될 때 마다 이 값과 함께 DllMain 함수가 호출된다. DLL에서는
이 값과 함께 DllMain함수가 호출된다. DLL에서는 이 값을 받았을 때 스레드별 종료처리를 한다.
이 값과 함께 DllMain함수가 호출된다. DLL에서는 이 값을 받았을 때 스레드별 종료처리를 한다.
# by | 2008/11/12 17:32 | Windows 프로그래밍 | 트랙백





☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]