강좌,팁

[강좌:015] 따라하기 10. 초기설정파일(ini) 이용하기 (2)

 

제2장 INI 파일 관련 작업 단계
지금부터는 프로그램의 초기설정정보를ini 파일에 저장하고 불러오는 기능을 활용하는 부분입니다. 이 단계는 CVI의 라이브러리를이용한 것이 아니라 제가 간단히 이용해오고 있는 예입니다. 나중에 CVI의 Toolbox에나오는 부분도 다루어볼 기회가 있을 겁니다.

7. DEFPROG_INI 파일 가져오기
저는 매 프로젝트를 작업할 때마다 자주이용되는 모듈들은 별도의 파일로 미리 만들어 두었습니다. 각 프로젝트마다 프로젝트명이 달라지므로 DEFPROG라는 프로그램명으로 일반화시켜 두었습니다. 그 중에 하나가INI 기능 관련한 DEFPROG_INI.h, DEFPROG_INI.c 파일입니다. 이 두 파일은 DEFPROG_INI.zip라는파일명으로 압축하여 자료실에 업로드해 두었습니다.
하나씩 하나씩 정리해둔DEFPROG 시리즈 샘플소스들을 모아 Case Tool을 만들까 생각 중입니다. 좀더 다양한경우에 대한 소스들이 마련되고 정리된 후라야 가능하겠지만요...

DEFPROG_INI.zip이라는 파일을 압축해제하면, DEFPROG_INI.h와 DEFPROG_INI.c파일이 나옵니다. 이 두 파일의 파일명부터 바꾸어서 프로젝트에 포함시킵니다. DEFPROG라는이름을 이번 강좌의 예제 프로젝트 명인 L015_UsingINI로 변경합니다. 그러면 다음과같이 되겠지요?

표 15.5 파일명 수정

수정전

수정후

DEFPROG_INI.h

L015_UsingINI_INI.h

DEFPROG_INI.c

L015_UsingINI_INI.c

 

그리고 수정된 각 파일의 내부에 있는 문자열도 표 15.6과 같이 모두 수정합니다.원래 defprog(소문자)로 된 이름은 프로젝트명의 소문자로 변경하는데, 이번 강좌예제 프로젝트 명은 그대로 사용합니다.

표 15.6 문자열 수정

수정전

수정후

DEFPROG

L015_UsingINI

defprog

L015_UsingINI

그림 15.14에 문자열이 대체된 L015_UsingINI_INI.h 파일의 일부를 보였습니다.

그림 15.14 문자열이 대체된 L015_UsingINI_INI.h 파일

그림 15.15에는 문자열이 대체된 L015_UsingINI_INI.c 파일의 일부를 보였습니다.

그림 15.15 문자열이 대체된 L015_UsingINI_INI.c 파일

설명을 간단히 붙이면, L015_UsingINI_INI.h 파일에 L015_UsingINI_INI_SETTING라는구조체를 정의하고 있습니다. (이렇게 이름이 길 필요는 없습니다. 그냥 SETTING라는이름으로 사용해도 상관없습니다만, 저는 다른 프로젝트의 소스를 합칠 때 Setting구조체의 이름을 구분하기 위해 아예 처음부터 프로젝트 명이 앞에 붙은 SETTING구조체를 정의합니다. 이건 여러분들의 습관에 맡기겠습니다.) 이 Setting 구조체는프로그램의 설정 정보를 갖고 있는 구조체로 사용합니다. 즉, 프로그램이 종료되었다가다시 실행될 때에 이전의 정보가 그대로 유지되는 설정값을 저장하기 위해 이 구조체를이용합니다.
저의 프로그래밍 습관이긴 한데, 프로그램 실행시에만 유지될 필요가있는 설정 혹은 상태값은 STATUS라는 구조체로 별도 관리합니다. 하지만 이번 강좌에서는STATUS 구조체는 등장하지 않습니다.

여기서 한가지 빠트리지 않고 해줄 것이 있는데요, L015_UsingINI_DEF.h라는 통합파일에L015_UsingINI_INI.h 헤더파일을 include 시켜주십시오. 아래와 같이 한 라인이 추가되었죠?


  #include "L015_UsingINI.h"
  #include "L015_UsingINI_common.h"
  #include "L015_UsingINI_INI.h"
 

8. Setting 구조체 멤버 변수 선언
Setting Panel을 보면서 프로그램종료시에도 유지되어야할 설정값들을 선언해 봅시다. 그림 15.3의 Setting Panel을보면서, L015_UsingINI_INI.h 파일의 L015_UsingINI_INI_SETTING 구조체 멤버 변수들을적어봅시다. (저는 Dual Monitor를 사용하므로 한쪽 모니터에는 UIR 파일을 띄워놓고,한쪽 모니터에서 L015_UsingINI_INI.h 파일을 편집합니다. 여러분도 여건이 되면듀얼 모니터를 사용하시는 것이 작업에 훨씬 도움이 될 겁니다.)

그림 15.16 Setting 구조체 멤버변수 입력(L015_UsingINI_INI.h파일)

그림 15.3에 보인 Setting Panel의 컨트롤 값들에 하나씩 대응되는 변수들입니다.데이터 타입도 맞아야겠죠? 참, WorkDir은 하도 자주 쓰여서 미리 DEFPROG_INI.h에넣어 두었습니다. 그림 15.16의 17라인에 보이죠?
그리고, 12~14라인에 선언해둔문자열은 저의 프로그램 작업시에 많이 쓰여서 넣어둔 것입니다. 이번 예제에서도부분적으로 이용되고 있습니다. (Project Directory 경로명을 파악해두기 시작한것은 CVI 6.0부터입니다. 그 이전에는 상관없었는데, 6.0부터는 Project Directory를확보하고 있지 않으면, 프로그램은 루트 디렉토리를 기본 디렉토리를 인식하더군요.이로 인한 고민이 한동안 좀 있었죠!)

9. Setting 초기화 함수
Setting 변수들을 선언했으므로 이제는 이값들을 초기화하고, 0pen하고, Save하고, 이 값을 이용해서 해당 컨트롤의 값을 Refresh해야합니다.먼저 초기화하는 함수 부분을 그림 15.17과 같이 입력합니다. L015_UsingINI_INI.c파일에 있습니다.

그림 15.17 Setting 변수값을 초기화(L015_UsingINI_INI.c 파일)

그림 15.17의 30라인부터 37라인까지가 초기값으로 초기화하는 부분인데, 무작정0으로 초기화하고 있습니다. 40라인에 보면, Open_...()함수를 이용하여 2차 및 3차초기화를 하고 있습니다. 파일로부터 불러오는 건데요, 만약 2차 3차에 해당되는파일이 없다면, 30라인에서 37라인에 걸쳐서 초기화된 값이 그대로 적용됩니다.

파일로부터 설정값을 불러오기 위해서는 설정값이 저장되어 있어야겠죠? 설정값을저장하는 과정부터 봅시다.

10. Setting 값을 파일에 저장하는 함수
그림 15.18에 Setting 변수들을저장하는 함수를 보였습니다.

그림 15.18 Setting 변수값을 저장(L015_UsingINI_INI.c 파일)

설정값의 데이터 형에 따라 %s, %g, 혹은 %d로 구분이 되므로 유의해서 보시기바랍니다. 이 함수는 프로그램 종료시에 꼭 실행되어야 다음 프로그램 실행시에 불러올수 있겠죠?

11. Setting 값을 파일로부터 불러오는 함수
이제 저장된 Setting 변수들을프로그램 시작시에 불러오기 위해 필요한 함수를 작성합니다. 그림 15.19를 보세요.지면관계상 소스의 일부만 보였는데요, 그림을 클릭하면 전체 소스가 나타납니다.

그림 15.19 Setting 변수값을 불러오기(L015_UsingINI_INI.c 파일)

여기서 사용된 GetStringItem() 함수는 저는 kdtechno_dll.dll 파일로 만들어두고사용하고 있는데, 여기서는 소스를 L015_UsingINI_INI.c에 붙여넣고, L015_UsingINI_INI.h에함수의 원형을 선언해 주도록 하겠습니다.

그림 15.20 GetStringItem() 함수의 정의(L015_UsingINI_INI.c파일)

GetStringItem() 함수의 선언은 L015_UsingINI_INI.h 파일에 넣어 주십시오. 이것은그림으로 따로 보여드리지는 않겠습니다.

 

12. Setting 값을 컨트롤에 적용하는 함수
이제 load된 Setting 값을해당 컨트롤에 세트하는 과정이 필요합니다. 그림 15.21에 보였습니다.

그림 15.21 Setting 변수값을 해당 컨트롤에 세트(L015_UsingINI_INI.c파일)

148라인에 보면 Refresh_LED()라는 함수가 사용되었는데, 이 함수는 Setting 값에따라 Main Panel의 LED 상태를 갱신해주는 함수입니다. 이 함수의 정의는 다음 장에서L015_UsingINI_common.c에 하겠습니다.

13. Setting 값 초기화 함수와 저장 함수를 적절한 위치에 추가
Setting값을 초기화하는 함수와 종료시에 저장하는 문장을 프로그램 전체의 초기화 함수와마무리 함수 내에 넣어 줍니다. L015_UsingINI_common.c 파일에 그림 15.22와 같이기입합니다.

그림 15.22 Setting 값의 초기화와 저장 함수를 프로그램 초기화함수와 마무리 함수 내에 추가

14. Setting 값에 따른 컨트롤의 상태값 갱신(Refresh_LED() 함수, L015_UsingINI_common.c파일)
그림15.23에는 Refresh_LED()함수를 보였습니다. 화면에 보이지 않는 부분까지 보려면,그림을 클릭하세요.

그림 15.23 Refresh_LED()함수(L015_UsingINI_common.c 파일)

Refresh_LED()함수를 정의했다면, 이 함수의 원형을 해당 헤더파일에 선언해 주어야겠죠?그림 15.24에 L015_UsingINI_common.h 파일을 보였습니다.

그림 15.24 Refresh_LED()함수의 선언(L015_UsingINI_common.h파일)

 

이제 INI 파일과 관련된 사용자 정의 함수가 거의 다 갖추어졌습니다. 프로그램이완성되려면 아직 한 단계가 남아 있지만, 여기서 컴파일해보고, 실행을 시켜보십시오.Debug 모드로 실행을 했을 때, 불러올 파일이 없는 경우 어떤 메시지를 내보내기도하지만 문제 없습니다.

이제 남아 있는 콜백함수들을 완성해 보겠습니다.

 


허창원

2003.03.23 01:26:20
*.96.191.238

[추가수정] 그림 15.15의 6라인을 다음으로 수정하세요. L015_UsingINI_INI_SETTING L015_UsingINI_ini_setting, prev_L015_UsingINI_ini_setting; 그림 15.14에서 L015_UsingINI_INI_SETTING구조체 변수의 외부변수 선언을 다음과 같이 수정하세요. extern L015_UsingINI_INI_SETTING L015_UsingINI_ini_setting, prev_L015_UsingINI_ini_setting; 그림 15.22에서 9라인 다음에 아래 문장을 추가하세요. prev_L015_UsingINI_ini_setting = L015_UsingINI_ini_setting;

석상수

2006.09.01 17:41:22
*.23.198.196

그림 15.20의 char *GetStringItem(FILE *fp, char *ItemName, char *val)
함수 부분을 보면... 마지막 인자 char *val 은 상위 루틴에서 buff_item
의 주소값을 받아오던데요...
결국 함수 초기에 val[0]=0; 로 초기화 시켜버리는데...
궂이 상위 루틴에서 주소값을 받아온 이유는 무엇인지...???
List of Articles
번호 제목 글쓴이 날짜 조회 수
56 [팁:6] 배포판(설치) 프로그램에 데이터 폴더 포함하기 허창원 2004-05-20 14916
55 [팁:5] Parallel Port 이용할 때, CVI Low-level support driver [2] 허창원 2004-05-18 12860
54 [팁004]팁아닌...팁..Text Message오른쪽 정렬..... [4] 야리싸내 2004-02-02 14964
53 객체의 위치값을 이용한 퍼즐 게임. file [2] 조인배 2004-01-09 13724
52 [강좌020]실행시에 uir파일을 사용하지 맙시다. file [6] 야리싸내 2003-12-19 13338
51 [강좌:019] CVI 런타임엔진과 설치 프로그램 허창원 2003-12-08 14648
50 그래프에 Zoom 기능을 만들어봤습니다.. ^^ file 야리싸내 2003-09-30 13393
49 헉..ㅠ_ㅠ;; 죄송합니다..위에 첨부파일에 소스가 없네요....ㅠ_ㅠ; file 야리싸내 2003-11-26 13338
48 [팁:003] NI DAQ 프로그래밍 예제 얻기 file 허창원 2003-08-11 14858
47 켄바스 기능을 이용한 아날로그시계 file [1] 조인배 2003-07-09 14545
46 [강좌:018] 따라하기 13. AudioPlayer(MP3, WMA, ASF, WAV 등) (2) 허창원 2003-04-11 13230
45 [강좌:018] 따라하기 13. AudioPlayer(MP3, WMA, ASF, WAV 등) (1) [1] 허창원 2003-04-11 14697
44 [강좌:017] 따라하기 12. 재사용 가능한 Library(static lib, DLL) 만들기 허창원 2003-04-11 15481
43 [팁:003] 종료시 MS Office와의 충돌 피해가는 대안 [2] 허창원 2003-04-01 13561
42 [강좌:016] 따라하기 11. 데이터 뷰어3로 업그레이드하기 (2) 허창원 2003-03-19 13875
41 [강좌:016] 따라하기 11. 데이터 뷰어3로 업그레이드하기 (1) 허창원 2003-03-19 12743
40 [강좌:015] 따라하기 10. 초기설정파일(ini) 이용하기 (3) [2] 허창원 2003-02-25 14019
» [강좌:015] 따라하기 10. 초기설정파일(ini) 이용하기 (2) [2] 허창원 2003-02-25 12546
38 [강좌:015] 따라하기 10. 초기설정파일(ini) 이용하기 (1) [2] 허창원 2003-02-25 14840
37 [강좌:014] 따라하기 9. 터치스크린에서 숫자 입력하기 (3) [4] 허창원 2003-01-15 12502