간단하게 DLL 만들기
프로그램을 짜다보면..DLL을 만들어서 사용해야될 경우가 있을수도 있는데.. 이에 관해서 간단하게 정리를 해보고자 한다..
DLL(Dynamic Link Library)는 말 그대로 동적으로 연결되는 라이브러리이다. 동적으로 연결된다는 것은 프로그램에 포함되어 컴파일되는것이 아니라 프로그램이 시작될때 연결됨을 의미한다...
이에 반에 정적링크라이브러리의 경우는 컴파일이 되는 과정에 라이브러리에 관련된 부분들이 실행파일에 포함되어 컴파일이 된다.
DLL을 사용하는 이유는 여러가지가 있으나 지금 생각나는 거는.;;
우선..DLL을 사용하게되면..개발시 분업이 편리하다는 장점이 있다.
만약에 두명의 프로그래머가 있는데 그중 한명은 프로그램의 외형을 기본적으로 만들고 다른 한명은 프로그램에서 사용하게 되는 핵심 알고리즘을 개발한다고 가정했을 경우, 두 프로그래머는 서로의 간섭없이 프로그램이 제작가능할 것이다..ㅋㅋㅋㅋ하하;;
그리고...또......머..기타등등;;;-_-;;; 많은 이유가 있습니다;;하하;;
생각해보면 많아요~~~~~~;;;
여튼....DLL이란 저런 기능을 하는 넘이고.......
비줠 씨++에서는 크게 두 종류의 DLL이 존재하게 되는데..
'일반 DLL'과 '확장 DLL'로 구분할수 있다고 한다..'확장 DLL'의 경우는 비줠씨++에서만 사용할수 있는 단점이 있으나 일반DLL에서 제공하지 못하는 몇가지 기능들을 제공하여 주는 장점도 있다.
일반 DLL의 경우 C++만 아니라 C언어, 파스칼, 비주얼 베이직 등 다른 환경에서도 사용이 가능하다. 그러나 한가지 단점은 외부에 공개되는 함수가 반드시 C언어의 함수형태로 제공되어야만 한다는 것이다. 단 DLL내부에서는 C++의 모든 기능을 사용할 수 있다.
확장 DLL은 이런 제약 없이 모든 것들이 외부 프로그램에 제공가능하다.
난 확장 DLL은 관심이 없으니까-_-..............'일반 DLL'을 만드는 방법에 대해서만 정리하도록 하겠다.
우선 비줠씨++을 실행시키고
File->New를 선택하여 새로운 프로젝트를 생성한다. 이때 주의할 점은
프로젝트를 Win32 Dynamic-Link Library로 생성하는 것이다. 그리고 선택화면이 나오는데 이 부분에서 a simple DLL project를 선택하면 된다.
다른것을 선택해도 되지만 ;; 귀찮다-_-;;;;;;;;;;;;;;;
선택하고 나면.. 파일이 몇개 자동으로 생성되고 소스파일에 보면
간단한 이런 코드가 보일 것이다. DllMain은 Dll이 메모리에 attach되거나 detach될때 실행되는 함수부분으로 일반 프로그램의 main함수라고 생각하면 될것이다. DLLMain이 어떨때 호출되는 가에 대한 값은 ul_reason_for_call 변수에 저장되어 있으니 구분을 해야되는 사람들은 알아서 구분하면 된다~~;;;(난 안써봐서ㅡㅡ;;)
자...........-_-..이제 DLL만들기에 대해서 50%는 끝났다;;-0-;;하하;;;
이렇게만 해놔도-_-.........우선 DLL만들기는 성공이다;(컴파일하면 dll이 생기긴한다;;)
그럼..간단한 함수하나를 만들어서 그 함수를 외부에 공개(?)해보기로 하자ㅋㅋ
위의 프로그램에
이 와 같은 코드를 추가하도록 하자..
머..복잡해 보이긴 하지만..
란 아주;; 간단한 함수이다....
그럼...........extern "C" __declspec(dllexport) 이놈이 뜻하는건 무엇일까..-0-;;
몰라서 책을 찾아봤으니;;;;앗-_-.........책에 아무 말도 없다ㅡㅡ;;........은근슬쩍 넘어가는 오-_-..이놈의 책;;;;;
인터넷을 찾아봐도 별 다른 자료는 없고..
__declspec 는 원래 표준 c keyword는 아니고
data나 nodule의 저장형태를 지정하기위한 선언자(declarator)입니다
__declspec(dllimport) 로 선언된 data나 function은 실행시
dll(동적라이브러리)에서 불러오면된다는 것을 명시하기 위한 것입니다.
이런 말을 찾을수 있었다...(네이버검색;;;하하)
내가 보기엔..
extern 이란 키워드는 우선........함수를 외부에 공개하는 키워드 이고.(일반적으로 여러 C파일을 같이 컴파일 할 경우 이 키워드를 사용하기는 하나.. 뭐 잘 보진 못했다..(내가 안 써서 그런가ㅡㅡ;..)
뒤에 있는 "C"는 C언어의 문법을 따른다는 말 같다;;....그리고 그 뒤엔...........이에 저 글을 참조..
('' )당연히 이 말은 틀릴 확률이 훨씬-_-높음;;하하;;;;;;;;;;;;;;
여튼동...저렇게 추가하고 나면.............test_func라는 함수가 외부에 공개되는 것이다.-0-..
자~~..이제 컴파일을 하자~!!ㅋㅋ
그러면..dll파일과 lib파일이 생성된 것을 볼수 있을 것이다..........
그럼..요놈을 복사해서 사용을 하면 되는데...........
이제 요놈을 사용하는 어플리케이션을 만들어보자~~..
우선 새로운 프로젝트를 열고.....Win32 Console Application을 열어서 새로운 프로젝트를 생성한다...
그리고 위에서 만들어진 lib파일과 dll파일을 프로젝트가 생성된 폴더로 복사를 한다~..
그리고.............
Alt+F7(Project->Setting)을 누르게 되면..프로젝트셋팅 창이 열리는데.....
여러탭들 중에 Link라는 탭에 들어간다~~..그리고 중간쯤에 보면.. Object/library modules라는 부분이 있는데 이 곳에 생성한 lib의 파일명을 기입하면 된다~~...........
그리고 생성한 DLL의 함수를 사용하기 위해서 함수선언부분을 기입해야된다.
extern "C" __declspec(dllimport) void test_func();
라는 형식으로 함수를 선언하게 되면...........요놈은 함수원형만을 가지게되고..프로그램 내부에서 이 함수가 호출되면 DLL에 있는 바디 부분을 찾아가서 실행되게 된다~~...
간단한 프로그램의 예제는;;
머..이정도?-_-..너무 간단한가?..;;ㅋㅋㅋ
이렇게 사용을 하면된다..
extern "C" __declspec(dllimport) void test_func(); --> 이 부분...-0-..다른 DLL을 가져다 쓸때는 이런 요상한 부분이 없어서 좋았는데..내가 짜면 이렇게 지저분한게 있어야..하나라고-_-혹시나 생각하시는 분들?;;(머.;;제가 그랬습니다..)
생각해보니;; 보통 DLL을 만들때 헤더파일도 같이 만들어서 배포하니까.......없는게 당연;;
-_-..우리도 까리하게~~~~~~~~~~공개되는 함수가 하나밖에 없지만...헤더파일을 하나 만들어서;;
include 시킵시다~~;;;;;;;;;;;;;;(뭐..전 귀찮아서 안합니다.;;)..
책에 보니 이것 말고도 조금 더 있긴 하지만..................머..언제 써먹을지 모르기 때문에
패스~~~~~~~~~~~~~~~~~~...
나머진 나중에 공부합세~;;
소스파일
프로그램을 짜다보면..DLL을 만들어서 사용해야될 경우가 있을수도 있는데.. 이에 관해서 간단하게 정리를 해보고자 한다..
DLL(Dynamic Link Library)는 말 그대로 동적으로 연결되는 라이브러리이다. 동적으로 연결된다는 것은 프로그램에 포함되어 컴파일되는것이 아니라 프로그램이 시작될때 연결됨을 의미한다...
이에 반에 정적링크라이브러리의 경우는 컴파일이 되는 과정에 라이브러리에 관련된 부분들이 실행파일에 포함되어 컴파일이 된다.
DLL을 사용하는 이유는 여러가지가 있으나 지금 생각나는 거는.;;
우선..DLL을 사용하게되면..개발시 분업이 편리하다는 장점이 있다.
만약에 두명의 프로그래머가 있는데 그중 한명은 프로그램의 외형을 기본적으로 만들고 다른 한명은 프로그램에서 사용하게 되는 핵심 알고리즘을 개발한다고 가정했을 경우, 두 프로그래머는 서로의 간섭없이 프로그램이 제작가능할 것이다..ㅋㅋㅋㅋ하하;;
그리고...또......머..기타등등;;;-_-;;; 많은 이유가 있습니다;;하하;;
생각해보면 많아요~~~~~~;;;
여튼....DLL이란 저런 기능을 하는 넘이고.......
비줠 씨++에서는 크게 두 종류의 DLL이 존재하게 되는데..
'일반 DLL'과 '확장 DLL'로 구분할수 있다고 한다..'확장 DLL'의 경우는 비줠씨++에서만 사용할수 있는 단점이 있으나 일반DLL에서 제공하지 못하는 몇가지 기능들을 제공하여 주는 장점도 있다.
일반 DLL의 경우 C++만 아니라 C언어, 파스칼, 비주얼 베이직 등 다른 환경에서도 사용이 가능하다. 그러나 한가지 단점은 외부에 공개되는 함수가 반드시 C언어의 함수형태로 제공되어야만 한다는 것이다. 단 DLL내부에서는 C++의 모든 기능을 사용할 수 있다.
확장 DLL은 이런 제약 없이 모든 것들이 외부 프로그램에 제공가능하다.
난 확장 DLL은 관심이 없으니까-_-..............'일반 DLL'을 만드는 방법에 대해서만 정리하도록 하겠다.
우선 비줠씨++을 실행시키고
File->New를 선택하여 새로운 프로젝트를 생성한다. 이때 주의할 점은
프로젝트를 Win32 Dynamic-Link Library로 생성하는 것이다. 그리고 선택화면이 나오는데 이 부분에서 a simple DLL project를 선택하면 된다.
다른것을 선택해도 되지만 ;; 귀찮다-_-;;;;;;;;;;;;;;;
선택하고 나면.. 파일이 몇개 자동으로 생성되고 소스파일에 보면
간단한 이런 코드가 보일 것이다. DllMain은 Dll이 메모리에 attach되거나 detach될때 실행되는 함수부분으로 일반 프로그램의 main함수라고 생각하면 될것이다. DLLMain이 어떨때 호출되는 가에 대한 값은 ul_reason_for_call 변수에 저장되어 있으니 구분을 해야되는 사람들은 알아서 구분하면 된다~~;;;(난 안써봐서ㅡㅡ;;)
자...........-_-..이제 DLL만들기에 대해서 50%는 끝났다;;-0-;;하하;;;
이렇게만 해놔도-_-.........우선 DLL만들기는 성공이다;(컴파일하면 dll이 생기긴한다;;)
그럼..간단한 함수하나를 만들어서 그 함수를 외부에 공개(?)해보기로 하자ㅋㅋ
위의 프로그램에
이 와 같은 코드를 추가하도록 하자..
머..복잡해 보이긴 하지만..
란 아주;; 간단한 함수이다....
그럼...........extern "C" __declspec(dllexport) 이놈이 뜻하는건 무엇일까..-0-;;
몰라서 책을 찾아봤으니;;;;앗-_-.........책에 아무 말도 없다ㅡㅡ;;........은근슬쩍 넘어가는 오-_-..이놈의 책;;;;;
인터넷을 찾아봐도 별 다른 자료는 없고..
__declspec 는 원래 표준 c keyword는 아니고
data나 nodule의 저장형태를 지정하기위한 선언자(declarator)입니다
__declspec(dllimport) 로 선언된 data나 function은 실행시
dll(동적라이브러리)에서 불러오면된다는 것을 명시하기 위한 것입니다.
이런 말을 찾을수 있었다...(네이버검색;;;하하)
내가 보기엔..
extern 이란 키워드는 우선........함수를 외부에 공개하는 키워드 이고.(일반적으로 여러 C파일을 같이 컴파일 할 경우 이 키워드를 사용하기는 하나.. 뭐 잘 보진 못했다..(내가 안 써서 그런가ㅡㅡ;..)
뒤에 있는 "C"는 C언어의 문법을 따른다는 말 같다;;....그리고 그 뒤엔...........이에 저 글을 참조..
('' )당연히 이 말은 틀릴 확률이 훨씬-_-높음;;하하;;;;;;;;;;;;;;
여튼동...저렇게 추가하고 나면.............test_func라는 함수가 외부에 공개되는 것이다.-0-..
자~~..이제 컴파일을 하자~!!ㅋㅋ
그러면..dll파일과 lib파일이 생성된 것을 볼수 있을 것이다..........
그럼..요놈을 복사해서 사용을 하면 되는데...........
이제 요놈을 사용하는 어플리케이션을 만들어보자~~..
우선 새로운 프로젝트를 열고.....Win32 Console Application을 열어서 새로운 프로젝트를 생성한다...
그리고 위에서 만들어진 lib파일과 dll파일을 프로젝트가 생성된 폴더로 복사를 한다~..
그리고.............
Alt+F7(Project->Setting)을 누르게 되면..프로젝트셋팅 창이 열리는데.....
여러탭들 중에 Link라는 탭에 들어간다~~..그리고 중간쯤에 보면.. Object/library modules라는 부분이 있는데 이 곳에 생성한 lib의 파일명을 기입하면 된다~~...........
그리고 생성한 DLL의 함수를 사용하기 위해서 함수선언부분을 기입해야된다.
extern "C" __declspec(dllimport) void test_func();
라는 형식으로 함수를 선언하게 되면...........요놈은 함수원형만을 가지게되고..프로그램 내부에서 이 함수가 호출되면 DLL에 있는 바디 부분을 찾아가서 실행되게 된다~~...
간단한 프로그램의 예제는;;
머..이정도?-_-..너무 간단한가?..;;ㅋㅋㅋ
이렇게 사용을 하면된다..
extern "C" __declspec(dllimport) void test_func(); --> 이 부분...-0-..다른 DLL을 가져다 쓸때는 이런 요상한 부분이 없어서 좋았는데..내가 짜면 이렇게 지저분한게 있어야..하나라고-_-혹시나 생각하시는 분들?;;(머.;;제가 그랬습니다..)
생각해보니;; 보통 DLL을 만들때 헤더파일도 같이 만들어서 배포하니까.......없는게 당연;;
-_-..우리도 까리하게~~~~~~~~~~공개되는 함수가 하나밖에 없지만...헤더파일을 하나 만들어서;;
include 시킵시다~~;;;;;;;;;;;;;;(뭐..전 귀찮아서 안합니다.;;)..
책에 보니 이것 말고도 조금 더 있긴 하지만..................머..언제 써먹을지 모르기 때문에
패스~~~~~~~~~~~~~~~~~~...
나머진 나중에 공부합세~;;
소스파일
'컴퓨터 이야기' 카테고리의 다른 글
| [C] 함수포인터 간단한 예제 (0) | 2006/01/19 |
|---|---|
| [Tip] 모음 (0) | 2006/01/17 |
| DLL 만들기 (9) | 2006/01/16 |
| 학부 게시판에 올라온 퀴즈?ㅋㅋ (0) | 2005/12/30 |
| Win32 Global API Hooking - 성상훈님 강좌.. (0) | 2005/12/25 |
| [Tip] 홈페이지 방문자 브라우저 확인하기 (0) | 2005/12/23 |
Trackback : http://heestory.kr/trackback/22
-
삭제
DLL 만들어 쓰기
2007/12/21 02:55 Tracked from [ 天地擲柶 ] 잔을 넘치게 만드는 마지막 한 방울처럼..프로젝트 생성 Visual Studio .NET 2005를 기준으로 쓴다. 일반 Win32 Console에서 짠 모듈을 DLL로 추출해 다른 프로젝트에서 끌어다 쓰는 방법을 간단한 예제와 함께 정리해보자. 먼저 Win32 콘솔 프로젝트를 하나 생성한다. 프로젝트 생성 응용 프로그램 설정에서 DLL을 선택한다. DLL 선택 이렇게 하면 아래와 같은 코드가 기본으로 생성된다. // dll_Calc.cpp : DLL 응용 프로그램에 대한 진입점을 정의합니..
TestDLL1.zip
댓글을 달아 주세요
저 부분은..c언어와 c++로 컴파일 했을 때
c++의 경우 오버라이딩을 지원하기 위해 함수 뒤에 임의의 문자열이 추가되어 링크되나 c언어의 경우 오버라이딩을 지원하지 않기 때문에 이런 부분에서 생기는 차이점 같은데-_-..여전히 아직은 잘 모르겠다..나중에 정확하게 알게되면 추가로 달겠음-0-;;
좋은 글 잘 봤습니다. :)
크크크 1분만에 이해됐습니다. 첨 시작하려는데 많은 도움이!! 감사!!
도움이되셨다니//다행이네요..ㅎ
열심히 하세요~
블러그에 처음 댓글 달아보네요
정말 이해하기 쉽게 설명해주셔서 감사합니다^^
하핫..첫 댓글의 영광을...ㅋㅋ
감사합니다-// 도움이 되셨다니..영광>_<ㅋㅋㅎ
정말 간단하면서도 깔끔하게 잘 설명해 주셨네요^^
잘 보고 갑니다^^
질문이 있습니다.
위에 설명한 'Alt+F7(Project->Setting)을 누르게 되면..프로젝트셋팅' 이 과정을 Visual Studio2008에서는 어떻게 해야하나요?
이것 저것 해 봤는데... 도통 모르겠습니다. 답변 부탁드립니다.
안녕하세요..^^..
제가 VS2008이 없어서 확인이 불가능하네요^^;;;ㅋ