최상단

컨텐츠

DLL 만들기

글 정보

Category
컴퓨터 이야기
2006. 1. 16. 19:14

본문

간단하게 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 시킵시다~~;;;;;;;;;;;;;;(뭐..전 귀찮아서 안합니다.;;)..

책에 보니 이것 말고도 조금 더 있긴 하지만..................머..언제 써먹을지 모르기 때문에
패스~~~~~~~~~~~~~~~~~~...


나머진 나중에 공부합세~;;

소스파일

트랙백과 댓글 여닫기

TOP