[Win32API] 라이브러리 구축하기 #6
2008/08/01 01:20
2008/07/31 - [프로그래밍/Win32API/MFC] - [Win32API] 라이브러리 구축하기 #5
역시 이어지는 포스팅...
7. 동적링크 라이브러리 사용하기 (명시적 연결, explicit linking)
명시적 연결은 lib 파일없이 dll 파일만 참조하여 사용할 수 있는 편리한 방법입니다.
명시적 연결 방식에서는 레퍼런스 카운트가 등장합니다.
처음 프로그램이 실행되면, LoadLibrary 함수로 DLL 을 가상 메모리로 불러들입니다.
이렇게 불러들인 라이브러리는 GetProcAddress 함수를 사용해서
라이브러리 내부의 함수를 참조할 수 있게 됩니다.
그리고 프로그램이 종료될 때 FreeLibrary 함수를 사용하여 가상 메모리에 등록된 라이브러리를 반환합니다.
아까 레퍼런스 카운트가 있다고 했는데,
이것은 LoadLibrary 호출시마다 1씩 증가하고,
FreeLibarary 호출시에 1씩 감소합니다.
만약, 동시에 여러개의 프로세스가 돌아간다고 생각해봅시다.
각각의 프로세스가 똑같은 DLL 을 명시적으로 참조하게 된다면...
이 프로세스들이 모두 종료되어, 레퍼런스 카운트가 0 이 될 때까지
가상 메모리에서 라이브러리가 반환되지 않습니다.
새 프로젝트를 생성해서 BlackOx.cpp 를 만들어 다음 코드를 작성합니다.
위 설명을 따라오셨다면 어려운 코드는 없으리라 생각됩니다.
이렇듯 명시적 연결은 dll 만 가지고 라이브러리 함수를 사용할 수 있는 좋은 방법입니다.
하지만, 코드가 복잡해지고 차후에 디버깅도 어려운 까닭에
명시적 연결보다는 암묵적 연결 방법을 많이 선호한다고 하는군요.
또한, 명시적 연결 방법을 사용하기 위해서는
지난 포스팅에 설명한 네임 맹글링 문제를 해결해주어야 합니다.
라이브러리 구축시에 extern "C" 선언을 하여 네임 맹글링이 발생하지 않도록 해줄 필요가 있겠지요.
위 코드를 보면
GetProcAddress(hinstLib, "swap");
이런 구문이 있습니다.
hinstLib 에서 swap 이라는 이름의 함수를 찾아내는 것인데,
라이브러리가 swap 이라는 정확한 함수이름을 가지기 위해서는
라이브러리를 구축했을 때 네임 맹글링이 발생하지 않았어야 합니다.
(네임 맹글링이 발생하면 함수이름이 _swap#2#$@#$ 이렇게 바뀐다구 했져?)
하지만 이렇게 네임 맹글링이 발생하지 않도록 막아놓고 DLL 을 만들어놓으면
C 컴파일러로는 언제든지 이 DLL 을 참조하여 사용할 수 있지만...
C++ 컴파일러로 이 DLL 을 참조하여 암묵적 연결방법을 사용할 수 없는 문제가 발생합니다.
복잡하져...?
다음 포스팅에는 총정리를 할 생각인데,
네임 맹글링을 완벽하게 해결하여 C/C++ 컴파일러에 상관없이 라이브러리를 구축하고 사용하는 방법을 설명합니다.
역시 이어지는 포스팅...
7. 동적링크 라이브러리 사용하기 (명시적 연결, explicit linking)
명시적 연결은 lib 파일없이 dll 파일만 참조하여 사용할 수 있는 편리한 방법입니다.
명시적 연결 방식에서는 레퍼런스 카운트가 등장합니다.
처음 프로그램이 실행되면, LoadLibrary 함수로 DLL 을 가상 메모리로 불러들입니다.
이렇게 불러들인 라이브러리는 GetProcAddress 함수를 사용해서
라이브러리 내부의 함수를 참조할 수 있게 됩니다.
그리고 프로그램이 종료될 때 FreeLibrary 함수를 사용하여 가상 메모리에 등록된 라이브러리를 반환합니다.
아까 레퍼런스 카운트가 있다고 했는데,
이것은 LoadLibrary 호출시마다 1씩 증가하고,
FreeLibarary 호출시에 1씩 감소합니다.
만약, 동시에 여러개의 프로세스가 돌아간다고 생각해봅시다.
각각의 프로세스가 똑같은 DLL 을 명시적으로 참조하게 된다면...
이 프로세스들이 모두 종료되어, 레퍼런스 카운트가 0 이 될 때까지
가상 메모리에서 라이브러리가 반환되지 않습니다.
새 프로젝트를 생성해서 BlackOx.cpp 를 만들어 다음 코드를 작성합니다.
위 설명을 따라오셨다면 어려운 코드는 없으리라 생각됩니다.
이렇듯 명시적 연결은 dll 만 가지고 라이브러리 함수를 사용할 수 있는 좋은 방법입니다.
하지만, 코드가 복잡해지고 차후에 디버깅도 어려운 까닭에
명시적 연결보다는 암묵적 연결 방법을 많이 선호한다고 하는군요.
또한, 명시적 연결 방법을 사용하기 위해서는
지난 포스팅에 설명한 네임 맹글링 문제를 해결해주어야 합니다.
라이브러리 구축시에 extern "C" 선언을 하여 네임 맹글링이 발생하지 않도록 해줄 필요가 있겠지요.
위 코드를 보면
GetProcAddress(hinstLib, "swap");
이런 구문이 있습니다.
hinstLib 에서 swap 이라는 이름의 함수를 찾아내는 것인데,
라이브러리가 swap 이라는 정확한 함수이름을 가지기 위해서는
라이브러리를 구축했을 때 네임 맹글링이 발생하지 않았어야 합니다.
(네임 맹글링이 발생하면 함수이름이 _swap#2#$@#$ 이렇게 바뀐다구 했져?)
하지만 이렇게 네임 맹글링이 발생하지 않도록 막아놓고 DLL 을 만들어놓으면
C 컴파일러로는 언제든지 이 DLL 을 참조하여 사용할 수 있지만...
C++ 컴파일러로 이 DLL 을 참조하여 암묵적 연결방법을 사용할 수 없는 문제가 발생합니다.
복잡하져...?
다음 포스팅에는 총정리를 할 생각인데,
네임 맹글링을 완벽하게 해결하여 C/C++ 컴파일러에 상관없이 라이브러리를 구축하고 사용하는 방법을 설명합니다.
'프로그래밍 > Win32API/MFC' 카테고리의 다른 글
| [System] 32비트와 64비트 시스템 (0) | 2008/08/05 |
|---|---|
| [System] 아스키코드와 유니코드 #3 (1) | 2008/08/04 |
| [System] 아스키코드와 유니코드 #2 (0) | 2008/08/04 |
| [System] 아스키코드와 유니코드 #1 (0) | 2008/08/04 |
| [Win32API] 라이브러리 구축하기 #7 (전체소스 첨부) (0) | 2008/08/03 |
| [Win32API] 라이브러리 구축하기 #6 (2) | 2008/08/01 |
| [Win32API] 라이브러리 구축하기 #5 (0) | 2008/07/31 |
| [Win32API] 라이브러리 구축하기 #4 (0) | 2008/07/31 |
| [Win32API] 라이브러리 구축하기 #3 (1) | 2008/07/31 |
| [Win32API] 라이브러리 구축하기 #2 (0) | 2008/07/31 |
| [Win32API] 라이브러리 구축하기 #1 (0) | 2008/07/31 |




아... 언제봐도 동현이의 블로그는 예술이야 ~
이번주 DLL 세미나 하는데 많은 도움이 되었다!!!!!!!!!
비주얼의 최강자야 동현이는 ㅋㅋ
아 블로그 대대적인 개편을 해야하는데 손도 못대구 있다 ㅎㅎ