강좌,팁

[강좌:44] ini 파일 이용하기(기본 활용)

조회 수 4434 추천 수 0 2013.05.29 13:44:45

2003년에 [강좌:015]에서 "초기설정파일(ini) 이용하기"를 다루었는데, 항목값을 읽어오기 위해 GetStringItem() 이라는 함수를 직접 만들어 사용하였습니다. 이번에는 LabWindows/CVI에서 제공하는 기능을 이용하여 보다 더 세련되게 이용하는 방법을 소개하려고 합니다. 이번 "[강좌:44] ini 파일 이용하기"에서는 원리 위주로 소개하고, 다음 강좌인 "[강좌:45] ini 파일 이용하기(CISManip.dll 활용)"에서는 실제 프로젝트에 적용할 때 유리한 방법을 소개하고자 합니다.

---------------------------------------------------------------------------------------

[강좌:44] ini 파일 이용하기(기본 활용)

 

강좌에 이용된 버전: LabWindows/CVI 2012 SP1
테스트해본 버전: LabWindows/CVI 9.0.1, 2010 SP1, 2012 SP1
강좌분류: 따라하기, 팁 소개
등급: 중급

 

차례
서론
1. 이번 예제 프로그램의 실행화면
2. 작업준비
3. 코딩하기
   3.1 통합헤더파일
   3.2 전역구조체 변수
   3.3 INI 모듈
   3.4 메인 소스 파일 수정
4. 실행하기
마무리

 

서론
ini 파일은 initialize 라는 단어에서 온 것으로 생각됩니다. 프로그램이 종료되었다가 다시 시작될 때, 이전 실행 단계에서 마지막으로 사용된 정보를 다시 불러오기 위해 확장자가 "ini" 인 파일에 그 정보를 기록하곤 합니다.

Windows가 요즘은 레지스트리를 주로 이용하지만, 예전에는 system.ini 와 win.ini 파일을 많이 이용했었습니다. Windows 7의 system.ini, win.ini 파일을 열어보니 예전에 비해 항목수가 많이 줄었네요.

 

 

그림 0.1 Windows 7의 system.ini와 win.ini

 

Windows 처럼 일반 프로그램들도 이런 ini 파일을 이용하여 프로그램의 옵션이나 기타 설정을 다음 실행시에도 유지할 수 있도록 할 수 있습니다.

그림 0.1에도 보인 바와 같이 ini 파일내에서 bracket 괄호([ ])로 싸인 부분을 섹션(Section) 이라고 하고, 등호(=) 표시 앞의 값을 태그(Tag) 라고 부르고, 등호(=) 뒤의 값은 Tag 값이 되겠습니다.(저는 지금까지 태그를 항목(Item)이라고 불러왔었는데, 이제부터 바꿔야겠네요)

예전의 [강좌:015]에서는 이런 Section 의 구분이 없이 Tag만 나열되는 방식이었습니다. 이번 강좌에서는 LabWindows/CVI에서 제공하는 inifile 관련 함수를 직접적으로 이용해 보도록 하겠습니다. 그리고, ini 파일과 관련하여 프로그램 내에서 반드시 처리하게 되는 부분을 언급하고, 다음 강좌 [강좌:45]에서 CISManip.dll 내에 구현된 함수를 통해 좀더 쉽게 사용할 수 있는 방법을 제시하고자 합니다.

 

1. 이번 예제 프로그램의 실행화면
이번 따라하기 예제의 실행화면을 그림 1.1에 보였습니다. String 컨트롤 하나, 정수형 데이터를 포함하는 스위치, 체크박스, 그리고 실수형 데이터를 포함하는 숫자 컨트롤이 보입니다. 이 컨트롤들에 설정된 값이 다음 실행시에도 유지될 수 있도록 ini 파일을 이용하게 될 것입니다.

 

그림 1.1 TestINI 프로그램의 실행화면

 

ini 파일을 이용하여 다음 실행시에도 상태가 유지되도록 하려는 항목은 다음과 같습니다.

 


  - Panel의 위치(top, left)

  - String 컨트롤의 값

  - POWER Binary Switch의 값 (이 값에 따른 LED 상태 갱신)

  - Opt1 체크박스 값

  - Setting Time 숫자 컨트롤의 값

 

 

2. 작업준비
작업 준비 과정은 "[강좌:21] CVI 프로그래밍 시작단계 정의(2)" 강좌 글의
"2. LabWindows/CVI의 프로그래밍 작업 시작단계" 부분에 따라 아래와 같이 간단히 정리합니다.
즉, 프로젝트 파일 저장, 화면구성, 속성설정, 기본 소스코드 생성의 과정을 요약합니다.

 

프로젝트 파일명: TestINI.prj

 

화면구성을 위한 uir 편집화면을 그림 2.1에 보였습니다.

 

그림 2.1 TestINI 프로젝트의 화면구성

 

uir 파일 내의 각 컨트롤의 속성은 표 2.1과 같이 설정하였습니다.

 

표 2.1 컨트롤의 속성값

컨트롤 종류 Constant Name Callback Function Label Default
Value
비고
String

strSTRING

strSTRING

String 컨트롤

 

 

Binary Switch

bsPower

bsPower

POWER

0 (off)

 

LED

LED_Power

 

 

 

 

Check Box

chkOpt1

chkOpt1

Opt1

 

 

Numeric

numSettingTime

numSettingTime

Setting Time

 

 

 

Panel의 속성은 표2.2와 같이 설정합니다.

 

표 2.2 Panel의 속성설정

Panel 속성설정

Constant Name

PANEL

Callback Function

PanelCB

Panel Title

TestINI

Other Attributes

 

 

이제, 기본 소스를 생성합니다. UIR 창의 Code-Generate-All Code 메뉴를 선택하여 나타나는 Generate All Code 창에서 Program Termination 난의 Select QuitUserInterface Callbacks에는 PanelCB를 체크하도록 합니다. 프로그램 종료시에 창의 닫기 버튼으로 종료되도록 할 것입니다.
기본으로 생성된 함수는 main() 함수와 PanelCB(), strSTRING(), bsPower(), chkOpt1(), numSettingTime() 함수들입니다. 그림 2.2에 생성된 TestINI.c 파일의 일부를 보였습니다.

 

그림 2.2 자동으로 생성된 TestINI.c 파일
(소스코드 이미지를 클릭하면 소스 텍스트 창이 나타난다는 거 아시죠?)

 

그림 2.3에 현재까지의 Project 창의 상황을 보입니다. TestINI.h 파일도 프로젝트에 포함시켰고, View - Workspace View Selection 메뉴에서 Classic View를 선택하여 보인 화면입니다.

 

그림 2.3 TestINI.prj 프로젝트 파일

 

여기까지 작업 준비 과정으로 보도록 하겠습니다.

 

3. 코딩하기
이제 작업 준비 과정에서 만들어진 소스 코드를 수정하겠습니다.
본 강좌 문서를 작성하기 전에 프로그램을 미리 테스트해보았는데요, 단계별로 하나씩 순서대로 기술해 나가려니 설명이 복잡해 지겠네요. 그래서 어느 정도 정리된 소스를 보여주고 설명을 덧붙이도록 하겠습니다.

되도록 예제 프로그램은 간단하게 만들려고 노력하지만, 실제 프로젝트에 이용하기에도 효율적이도록 다음 몇가지 모듈들을 적용합니다. 이는 "[강좌:41] Prototype 프로그램 CISDEFPROG 소개"에서도 소개된 부분인데, 여기서는 통합헤더파일, 전역구조체 변수, INI 모듈을 간단하게 만들어서 이용해 보겠습니다.

 

3.1 통합헤더파일
통합헤더파일은 각 소스 파일마다 여러 개의 헤더파일을 include 하는 번거로움을 좀 피해가기 위한 방법입니다. 헤더 파일 include를 이 한 헤더파일에 다 모아두고, 정작 각 소스 파일에는 이 통합헤더파일 하나만 include 하도록 하는 것입니다.
그림 3.1.1에 통합헤더파일, TestINI_DEF.h 파일을 보였습니다. TestINI_mod_INI.h 와 TestINI_mod_GloVar.h 헤더파일은 다음 절에서 설명되어 집니다.

 

그림 3.1.1 통합헤더파일, TestINI_DEF.h

 

3.2 전역구조체 변수
전역구조체 변수는 전역변수를 좀더 쉽고 체계적으로 관리하기 위한 방법인데, 저는 이 방법으로 많은 혜택을 보고 있습니다. 그림 3.2.1에 전역구조체 변수 관련한 TestINI_mod_GloVar.h 헤더파일을 보였습니다. 서브구조체, 전역구조체, 전역구조체 변수, 매크로 상수로 나누어져 있음을 그림 상에 표시하였습니다.

 

그림 3.2.1 전역구조체 변수를 이용하기 위한 모듈, TestINI_mod_GloVar.h 파일

 

3.3 INI 모듈
INI 모듈이라고 이름 붙인 두 파일 TestINI_mod_INI.h 와 TestINI_mod_INI.c 파일은 ini 파일을 저장하고 불러오기 위한 기능들을 정리하여둔 파일입니다. 그림 3.3.1에는 TestINI_mod_INI.h 헤더파일을, 그림 3.3.2에는 TestINI_mod_INI.c 소스 파일을 보였습니다.

 

그림 3.3.1 TestINI_mod_INI.h 헤더파일

 

그림 3.3.2 TestINI_mod_INI.c 소스 파일의 일부

 

TestINI_mod_INI.c 파일에는 아래와 같이 총 3개의 함수가 정의되어 있습니다. 이름을 보아 알 수 있듯이 Proc_SaveINI() 함수는 ini 파일을 저장하는 함수이고, Proc_OpenINI() 함수는 ini 파일로부터 불러오는 함수입니다. 중간의 CIS_Ini_GetStringCopy() 함수는 CVI에서 제공하는 ini 관련 함수 중 문자열로 된 항목을 읽어올 때, 부가적으로 처리해야할 부분을 별도의 함수로 만든 것입니다. 이 CIS_Ini_GetStringCopy() 함수는 TestINI_mod_INI.c 파일 내에서만 이용되기 때문에 TestINI_mod_INI.h 헤더 파일에는 함수의 선언이 포함되어 있지 않습니다.

 


 int Proc_SaveINI(char *filepath)

 void CIS_Ini_GetStringCopy(IniText iniText, char *section, char *tag, char *item)

 int Proc_OpenINI(char *filepath)
 

 

여기서, TestINI_mod_INI.c 파일에 있는 Save 함수와 Open 함수를 조금더 상세히 들여다 볼 필요가 있습니다. 그림 3.3.3에는 Proc_SaveINI() 함수를 보였습니다. Section 명과 Item의 Tag 명, 그리고 해당 변수를 적절히 적어주었습니다. 변수가  정수형, 실수형, 문자열에 따라 해당 함수가 이용된 것을 주목하여 보시기 바랍니다.

 

그림 3.3.3 TestINI_mod_INI.c 소스 파일 중 Proc_SaveINI() 함수

 

그림 3.3.4에는 Proc_OpenINI() 함수를 보였는데, 마찬가지로 Section 명, Item의 Tag명, 그리고 해당 변수의 포인터를 파라미터로 넘겨주고 있습니다.

 

그림 3.3.4 TestINI_mod_INI.c 소스 파일 중 Proc_OpenINI() 함수

 

그리고, 이 INI 모듈의 함수 중 Ini_로 시작되는 함수는 LabWindows/CVI에서 제공하는 inifile 라이브러리에 포함되어 있으므로, 프로젝트 파일에 그 라이브러리를 포함시켜야합니다. 그림 3.3.5에 inifile 관련 파일들을 보였습니다. 여기서 function panel 파일인 inifile.fp 만 프로젝트 파일에 포함시키면, LabWindows/CVI 가 나머지 파일을 알아서 빌드시에 이용합니다. (제 PC를 기준으로 아래의 폴더는 C:\Program Files (x86)\National Instruments\CVI2012\toolslib\toolbox입니다.)

 

그림 3.3.5 inifile 관련 파일들

 

이제 Project 창은 그림 3.3.6과 같이 되어 있을 것입니다.

 

그림 3.3.6 TestINI.prj 프로젝트 창

 

다음 강좌 [강좌:45]에서 소개되겠지만, CISManip.dll을 이용하게 되면, 이 inifile.fp를 프로젝트에 포함시키지 않아도됩니다.

 

3.4 메인 소스 파일 수정
이제 필요한 모듈들이 다 갖추어졌으므로, 이 모듈들을 이용하는 메인 소스를 수정할 차례입니다. 수정하기 전의 그림 2.2의 소스와 비교하여 달라진 부분을 요약하면 다음과 같습니다.

 


  ① 각 컨트롤 콜백함수 내에 해당 컨트롤의 값을 읽어오는 문장이 추가되었습니다.

  ② POWER 라고 Label 이 붙여진 Binary Switch의 콜백함수에는 그 값에 따라 LED를 On/Off 하도록 되었습니다.

  ③ 헤더파일 include가 하나의 통합헤더파일 include로 정리되었습니다.

  ④ 전역구조체 변수 glovar 이 선언되었습니다.

  ⑤ panelHandle 변수는 전역구조체 변수 glovar 내에 포함되었고, 매크로 상수 GpanelHandle로 선언되었습니다.

  ⑥ main() 함수 내에서 ini 파일을 불러와서 초기화하고, 종료 전에 저장하는 문장들이 추가되었습니다.
 

 

하나씩 살펴보겠습니다. 그림 3.4.1에 수정내용 ①과 ②를 보였습니다.

 

그림 3.4.1 컨트롤 콜백함수

 

그림 3.4.2에 수정내용 ③~⑥ 까지를 보였습니다. ⑥ 수정사항은 화면을 표시하기 전의 초기화 과정과, 프로그램 종료하기 전에 마무리하는 두 부분으로 나누어 집니다.

INI 초기화 부분을 다시 세분화하면, ini 파일이 존재하지 않을 때의 초기값을 지정하는 부분, ini 파일을 불러오는 부분, ini 파일로부터 읽어들인 Tag 값을 적용하는 부분으로 나누어집니다. 이는 어떤 프로그램이든지 이런 과정이 필요합니다. (이런 부분을 다음 강좌 [강좌:45]에서는 좀더 쉽게 이용할 수 있는 방법을 제공하고 있습니다.)

INI 마무리하는 부분은 덜 복잡한데, ini에 저장할 Tag 값 중에서 최종값이 갱신되지 않은 변수에 대해서 그 값을 얻어오는 부분이 있습니다.

 

그림 3.4.2 TestINI의 main() 함수

 

Panel의 Callback 함수인 PanelCB() 함수는 그림 2.2에서 보인 그대로입니다.

 

4. 실행하기
이제 프로그램을 빌드하여 실행해보도록 합시다. 그림 4.1에 TestINI 프로그램을 실행하여 각 컨트롤의 값을 변경한 화면입니다. 그리고 Panel의 위치도 임의의 위치로 옮겨 놓은 다음, 프로그램을 종료하여 다시 실행하면, 이전의 상태가 유지되는 것을 확인할 수 있습니다.

 

그림 4.1 TestINI 프로그램의 실행

 

TestINI 프로그램을 종료하면, 각 컨트롤의 값과 Panel의 위치 값이 TestINI.ini 파일에 저장됩니다. 그림 4.2에 TestINI.ini 파일이 생긴 것을 볼 수 있으며, 그림 4.3에 TestINI.ini 파일을 보였습니다.

 

그림 4.2 TestINI.ini 파일이 생성됨

 

그림 4.3 생성된 TestINI.ini 파일의 내용

 

마무리
이번 강좌에서는 프로그램의 설정을 ini 파일에 저장하는 과정을 CVI에서 제공하는 라이브러리 중 하나인 inifile.fp를 이용하여 보였습니다. inifile.fp 의 함수를 직접 이용하였는데, 원리 위주의 설명을 하였고, 실제 응용에서는 다음 강좌 [강좌:45]에서 CISManip.dll의 함수를 이용하게 되면 보다 더 효율적일 것이라고 생각합니다.

 

감사합니다.

 

2013-05-29 (수)

극동테크 허창원 드림

 


석희남

2013.11.05 14:29:29
*.93.26.226

도움 많이 받고 갑니다 감사합니다 ^^

List of Articles
번호 제목 글쓴이 날짜 조회 수
115 멀티쓰레드 사용 시, 메모리 관련 참고사항입니다. [1] 요돌이 2017-10-24 431
114 [팁]타이머 사용시 주의할점. file 이현화 2014-02-13 2025
113 Lable 세로쓰기 [1] 초보 2013-12-21 1215
112 [강좌:45] ini 파일 이용하기(CISManip.dll 활용) [2] 허창원 2013-05-29 3359
» [강좌:44] ini 파일 이용하기(기본 활용) [1] 허창원 2013-05-29 4434
110 [강좌:43] Panel 크기 변경시에 컨트롤의 위치나 크기 조절하기(CISManip.dll 활용) 허창원 2013-03-12 5821
109 [강좌:42] Panel 크기 변경시에 컨트롤의 위치나 크기 조절하기(기본 활용) 허창원 2013-03-12 5824
108 [팁21] 그래프를 지우고 그릴때의 plotHandle을 구하는 방법 [1] 야리싸내 2012-05-25 7085
107 [강좌:41] Prototype 프로그램 CISDEFPROG 소개 [1] [1] 허창원 2012-01-03 8199
106 [강좌:40] CIS Project를 시작하며... [4] 허창원 2011-12-29 8019
105 ------------- 이제 새로운 지평이 열립니다 ------------- 허창원 2011-12-29 8449
104 [팁]그룹명령(고수님들은 패스~ ^^;) file [2] 이현화 2009-06-15 22615
103 [KD스타일규칙] Panel, Control, Function 에 대한 이름부여규칙 file 허창원 2008-10-15 20429
102 [팁]Elaped Time [1] 이현화 2008-10-15 25897
101 [팁:19] 시리얼 포트 모니터링(Serial Port Monitoring) 유틸리티 소개 [9] [1] 허창원 2008-05-12 70386
100 [팁:18] CVI에서 ActiveX 컨트롤 사용하는 절차 file [2] 허창원 2008-04-07 30377
99 [강좌:39] 입맛대로 좀더 편리하게 배포용 설치 프로그램 만들기(CVI 8.5 이용) [1] [1] 허창원 2008-03-14 22321
98 [강좌:38] 배포용 설치 프로그램 만들기(CVI 8.5 이용) 허창원 2008-03-14 21991
97 [팁]간단한 최소화 기능개선입니다. 김민수 2007-10-05 23629
96 [강좌:37] 테이블 셀로 파일을 드래그앤드롭하기 file [1] 허창원 2007-09-01 29161