강좌,팁

허창원 *.19.44.230

[강좌:28] 나만의 대화 상자를 라이브러리(Static Library, DLL)로 만들기(2)

3. DLL(Dynamic Link Library)로 만들기
Static Library와는 별개로 DLL을 만들어보겠습니다.

3.1 DLL 프로젝트
새로운 프로젝트를 만들어서 UI 코드 파일(MyConfirmPopup_uir.h , MyConfirmPopup_uir.c)과 MyConfirmPopup() 함수가 정의된 MyConfirmPopup.c 파일을 프로젝트에 포함시킵니다.

프로젝트 파일명: MyPopupDLL.prj

그림 3.1에 MyPopupDLL.prj 프로젝트 창을 보였습니다.

그림 3.1 MyPopupDLL.prj 프로젝트 창

이제 프로젝트의 Target Type을 Dynamic Link Library로 설정해야겠습니다. 그림 3.2에 그 과정을 보였습니다.

그림 3.2 프로젝트의 Target Type을 Dynamic Link Library로 설정

DLL인 경우 한가지 더 있습니다. 그림 3.2의 메뉴에 보면, Target Type 바로 밑에 Target Settings... 라는 메뉴가 있습니다. 여기서 Export될 함수의 프로토타입 선언이 있는 헤더 파일을 지정해주어야되는데요, 그러자면 우선 DLL에 대한 헤더파일을 먼저 만들어주어야겠습니다. 그림 3.3에 DLL의 헤더파일을 보였습니다.

그림 3.3 DLL 헤더파일인 MyPopupDLL.h

이 헤더파일도 불러오기 편하도록 MyPopupDL.prj 프로젝트에 포함시킵니다. 그리고 나서, Build-Target Settings... 메뉴를 선택합니다. 그러면, 그림 3.4와 같은 대화 상자가 나타나며 그림과 같이 설정합니다.

그림 3.4 Target Settings에서 DLL Export Options 설정

이 프로젝트에서 Export될 함수의 선언이 되어 있는 헤더파일을 체크하시면 됩니다.

3.2 DllMain() 함수 추가
DLL에서는 DllMain()이라는 Entry Point 함수가 있어야됩니다. 그림 3.5와 같이 MyConfirmPopup.c 파일에 DllMain() 함수를 추가하도록 합니다. 커서를 다른 함수가 정의되기 전 위치에다 놓고, 메뉴를 선택하도록 하시구요.

그림 3.5 DllMain 함수를 추가하기(MyConfirmPopup.c 파일)

그림 3.6에 DllMain() 함수가 추가된 화면을 보였습니다.

그림 3.6 DllMain() 함수가 추가된 MyConfirmPopup.c 파일

3.3 Export될 함수에 수식어 추가
DLL 파일을 만들 때, 모든 함수를 Export하지는 않습니다. 즉, 모든 함수가 다른 프로그램에 의해 호출되지는 않습니다. 그래서, Export 될 함수에는 __stdcall 이라는 수식어를 붙여줍니다. DLLEXPORT라는 매크로 상수로도 define 되어 있으므로 편하실 대로 붙여주시면 되고, 참고로 DLLEXPORT 매크로는 cvidef.h 에 선언되어 있습니다.
그림 3.6에는 MyConfirmPopup.c 파일에 수정된 부분을 보였고, MyPopupDLL.h 파일은 이미 그림 3.3에서 적절히 만들었습니다.

그림 3.6 MyConfirmPopup() 함수에 붙여진 DLLEXPORT(MyConfirmPopup.c 파일)

이제 Build하시면 되겠습니다. userint.h 헤더파일을 include 시켜야 한다는 대화 상자가 나타나면, "Yes"하시고 넘어갑니다.

Release 모드로 Build하면 MyPopupDLL.h, MyPopupDLL.lib(Import Library임), MyPopupDLL.dll 파일이 생성되고, 이 파일들을 다른 프로젝트에서 이용하시면 되겠습니다.

3.4 DLL 테스트
MyPopupDLL.dll을 테스트하기 위한 새로운 프로젝트를 만들어 봅시다.

프로젝트 파일명: MyPopupDLL_Test.prj

이 프로젝트에는 위에서 만든 MyPopupDLL.lib 파일과 강좌 27에서 만든 MyPop.* 파일을 포함시키도록 합니다. 그림 3.7에 MyPopupDLL_Test.prj 프로젝트 창을 보였습니다.

그림 3.7 MyPopupDLL_Test.prj 프로젝트 창

위의 파일들 중에서 MyPopup.c의 헤더파일 include 부분만 수정해 주면 되겠습니다. 그림 3.8에 수정된 MyPopup.c 파일을 보였습니다.

그림 3.8 MyPopupDLL.dll을 사용하도록 수정된 MyPopup.c 파일

이제 프로그램을 Build 하여 실행해보도록 합시다. 앞 강좌에서 실행된 것과 똑같이 실행되죠?

그림 3.9 MyPopupDLL.dll 을 이용하는 MyPopupDLL_Test.exe 프로그램

3.5 DLL 이용시 유의사항
LabWindows/CVI로 개발한 DLL은 CVI Run-time engine이 있는 환경에서만 이용할 수 있습니다. 즉, LabWindows/CVI가 설치되어 있다든지, CVI Run-time engine이 설치되어 있든지, 아니면 CVI로 개발한 프로그램이 설치되어 있으면 됩니다.

그래서 이것과 연관된 얘기겠지만, CVI 6 버전에서 만든 DLL은 CVI 7 버전에서 아무제약없이 사용 가능할 것입니다.(아마 그럴 것입니다. 지금 테스트를 못해보지만, 기억을 더듬어 보면 그랬던 것 같습니다.)

하지만, CVI 7버전에서 만든 DLL은 CVI 7 Run-time engine을 이용하므로, CVI 6 버전에서는 사용할 수 없습니다. 이런 경우, CVI 7 Run-time engine을 별도로 설치해야겠지요. 이것은 CVI 7.0과 7.1 사이에서도 마찬가지였습니다.

DLL을 배포하실 때는 Run-time engine까지 함께 배포판으로 만들어서 배포하시는 것이 좋을 것 같고, 그냥 DLL과 header file, Import Library만을 배포하실 때는 반드시 작성한 CVI 버전을 알리는 것이 좋겠습니다.

Static Library는 버전 간의 충돌이 훨씬 적은 것 같습니다. 즉, CVI 7에서 만든 Static Library는 CVI 6에서도 대개의 경우 사용가능할 것 같습니다.(이것도 지금 테스트를 못해보지만, 기억을 더듬어보면 그런 경향이 있었던 것 같습니다.)

하지만, 이왕에 다른 개발자와 공유하시려면, 소스 레벨로 제공하는 것이 미덕일 것 같습니다.

마무리
이렇게 해서, 나만의 대화 상자를 라이브러리로 만드는 과정을 살펴보았습니다. 3.5절에서 언급했듯이 Static Library와 DLL은 나름대로의 장단점이 있습니다. 하지만 두가지 모두, 이미 개발한 내용을 다음에 재사용하겠다는 의지가 반영되어 있다고 할 수 있겠죠!
그러므로, 개발한 내용을 라이브러리화 한다는 것은 철저한 검증과정이 필요하고, 또 언제든 쉽게 이용할 수 있도록 매뉴얼화하는 것이 꼭 필요합니다. 매뉴얼까지는 아니라도 함수에 대한 코멘트와 사용예 정도는 헤더파일에 남겨두는 게 좋을 것 같습니다.(이번 강좌에서는 그런 모범을 보이지는 못했지만 말입니다..ㅎㅎㅎ)

 

지금은 부활절을 앞둔 사순절 기간입니다. 우리를 위해 고난당하신 예수님의 사랑을 되새기며, 모든 분들에게 하나님의 사랑이 온전히 이루어지기를 기원합니다.

 

2005년 3월 12일 토요일
창원시 팔용동 사무실에서
극동테크(www.kdtechno.com) 허창원

List of Articles
번호 제목 글쓴이 날짜 조회 수
76 [팁:12] Windows 98용 프로그램은 CVI 6 이하에서 Build할 것 file [3] 허창원 2005-07-16 23860
75 [팁:11] Radio Group을 사용하기 위한 과정 file 허창원 2005-07-14 15135
74 [계획] CVI 강좌를 좀더 체계화하기 위해... 메모함 허창원 2005-05-19 14829
» [강좌:28] 나만의 대화상자를 라이브러리(Static,DLL)로 만들기(2) 허창원 2005-03-12 14092
72 [강좌:28] 나만의 대화상자를 라이브러리(Static,DLL)로 만들기(1) file 허창원 2005-03-12 15672
71 [강좌:27] 내 입맛에 맞는 대화 상자 만들기 file 허창원 2005-03-11 14255
70 자동 파일 생성 코드 [1] 허만회 2005-03-03 12825
69 [팁:10] CVI로 DLL 만들기(요약) file [1] 허창원 2005-02-22 18806
68 [강좌:26] 간단한 RS-232 통신예(NI-VISA 함수 이용) 허창원 2005-02-05 75990
67 [강좌:25] 간단한 RS-232 통신예(RS-232용 함수 이용) [2] [2] 허창원 2005-02-05 28648
66 [팁:9] 프로그램 내에서 메뉴 만드는 과정 요약 file 허창원 2005-01-22 12178
65 [팁:8] UIR 파일을 실행파일에 포함하는 방법 file [2] 허창원 2005-01-22 19244
64 [강좌:24] 수치를 String 컨트롤에 출력 file 허창원 2004-12-01 12665
63 [강좌:23] Noisy 신호를 Filtering 하기(2) 허창원 2004-07-23 12823
62 [강좌:23] Noisy 신호를 Filtering 하기(1) file 허창원 2004-07-23 15829
61 [강좌:22] 드래그 앤 드롭 이용하기 [1] 허창원 2004-07-06 13122
60 [강좌:21] CVI프로그래밍 시작단계 정의(3) [1] 허창원 2004-07-06 12008
59 [강좌:21] CVI프로그래밍 시작단계 정의(2) 허창원 2004-07-06 12820
58 [강좌:21] CVI프로그래밍 시작단계 정의(1) 허창원 2004-07-06 13148
57 [팁:7] 작업화면 스타일 선택하기 [1] 허창원 2004-07-05 14910