강좌,팁

[강좌:45] ini 파일 이용하기(CISManip.dll 활용)

조회 수 3359 추천 수 0 2013.05.29 18:01:02

이번 강좌는 "[강좌:44] ini 파일 이용하기"에서 원리 위주로 소개된 내용을 CISManip.dll 내의 함수들을 이용하여 보다 쉽게 이용할 수 있도록 소개합니다. 전체적으로 같은 내용을 다루므로 대부분의 내용이 그대로이고, 달라진 부분만 새로 작성합니다.

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

[강좌:45] ini 파일 이용하기(CISManip.dll 활용)

 

강좌에 이용된 버전: 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 값이 되겠습니다.

예전의 [강좌:015]에서는 이런 Section 의 구분이 없이 Tag만 나열되는 방식이었습니다. 이번 강좌에서는 CISManip.dll 이라는 라이브러리를 이용할 것인데, 이 라이브러리 내에는 LabWindows/CVI에서 제공하는 inifile 관련 함수를 이용하고 있습니다.

 

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

 

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

 

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

 


  - Panel의 위치(top, left)

  - String 컨트롤의 값

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

  - Opt1 체크박스 값

  - Setting Time 숫자 컨트롤의 값

 

 

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

 

프로젝트 파일명: CISTestINI.prj

 

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

 

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

 

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

CISTestINI

Other Attributes

 

 

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

 

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

 

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

 

그림 2.3 CISTestINI.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 통합헤더파일, CISTestINI_DEF.h

 

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

여기서 GloVar 구조체 내의 CIS_INI 데이터 형은 CISManip.h 파일 내에 정의된 구조체입니다. 이 CISTestINI_mod_GloVar.h 헤더 파일이 include 되기 전에 CISManip.h 헤더 파일이 include 되어야합니다. 그림 3.1.1의 통합헤더파일 내에 CISTestINI_mod_INI.h 헤더 파일 내에 CISManip.h 헤더 파일을 include 하고 있습니다.(그림 3.3.1 참조)

 

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

 

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

 

그림 3.3.1 CISTestINI_mod_INI.h 헤더파일

 

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

 

CISTestINI_mod_INI.c 파일에는 총 5개의 함수가 정의되어 있습니다. 이들 함수 내에서 사용되는 중요한 전역변수는 Gini 로 간단하게 명명된 glovar.ini 변수입니다.

INI 관련 함수 5개를 하나씩 살펴보겠습니다.

그림 3.3.3에는 Proc_INI_AddItem() 함수를 보였습니다. 이 함수는 ini 파일 내에 추가할 Section 명, 변수, tag 명, 초기값, 그리고, 직접적으로 연관된 Panel의 핸들과 Control ID 정보를 추가하는 기능을 수행합니다.

 

그림 3.3.3 Proc_INI_AddItem() 함수 (CISTestINI_mod_INI.c 파일내)

 

Proc_INI_AddItem() 함수 내의 한 라인을 좀더 자세히 살펴보면, 아래에 POWER 이라는 label이 붙은 Binary Switch 컨트롤의 값을 관리하는 항목입니다.

Gini.AddItemInt (&Gini, SectionName, iniGroup, &(glovar.General.bsPower), "bsPower", 0, GpanelHandle, PANEL_bsPower);

 

위의 함수에서 각 인자에 대한 설명은 다음과 같습니다.

SectionName 은 미리 Section명을 문자열로 복사해둔 것이고,
iniGroup 변수는 CISTestINI_mod_INI.h 헤더파일 내에 선언된 INI Group 상수값을 지정합니다. 이는 INI Tag를 Group별로 구분하여 해당 컨트롤에 적용한다든지, 파일에 저장하는 기능을 수행하기 위해 마련해둔 변수입니다.
그 다음의 &(glovar.General.bsPower) 는 ini로 관리할 변수의 주소입니다.
"bsPower" 는 tag 명으로 이용할 문자열입니다.
그다음 인자인 0은 glovar.General.bsPower 변수에 지정할 초기값입니다. 이 값은 프로그램 실행시에 ini 파일(여기서는 CISTestINI_default.ini, CISTestINI.ini 파일)이 존재하지 않을 때 유효한 값입니다.
GpanelHandle은 glovar.General.bsPower 변수의 값과 연계된 컨트롤이 있는 panel의 handle 값이고,
PANEL_bsPower은 glovar.General.bsPower 변수의 값과 연계된 Control ID입니다.

위와 같은 정보가 Proc_INI_AddItem() 함수 내에서 제대로 지정되어 있으면, ini 항목의 값을 ini 파일로부터 읽어온다든지, 저장하는 것, 또 그 정보를 해당 컨트롤에 적용하는 과정이 자동으로 진행됩니다.

 

다음 그림 3.3.4에는 세 함수를 보였는데, Proc_INI_InitEx() 함수는 또 한번의 ini 관련 변수의 값을 초기화하는 과정을 직접 추가하기 위한 함수이고, Proc_INI_ApplyEx() 함수에는 ini 관련 변수의 값을 해당 컨트롤에 수동으로 적용할 때의 코드가 들어갑니다. 아래 코드의 SetPanelPos() 함수는 Panel의 위치를 지정하는 함수인데,  그림 3.3.3에 빨간 박스친 부분의 설명에 나오듯이 해당 컨트롤이 없기 때문에 자동으로 적용되는 것이 아니라서 이렇게 Proc_INI_ApplyEx() 함수에서 적용하는 코드가 들어간 것입니다.
Proc_INI_Finish() 함수는 프로그램 종료시에 호출되는데, ini 에 저장할 항목 중에서 값의 갱신이 필요한 변수에 대해 그 값을 얻어오는 부분과 ini 파일로 저장하는 부분 등으로 이루어져 있습니다. 이때 저장되는 파일명(경로 포함)은 그림 3.3.5에 보인 Proc_INI_Initialize() 함수 내에서 지정된 Gini.iniFilePath 가 됩니다.

 

그림 3.3.4 Proc_INI_InitEx(), Proc_INI_ApplyEx(), Proc_INI_Finish() 함수 (CISTestINI_mod_INI.c 파일내)

 

아래의 그림 3.3.5는 프로그램 시작시에 한번 호출하면 되는 INI 초기화 함수입니다.

 

그림 3.3.5 Proc_INI_Initialize() 함수 (CISTestINI_mod_INI.c 파일내)

 

ini에서 관리하는 변수의 값이 초기화 되는 과정은 다음과 같음을 Proc_INI_Initialize() 함수를 보고 유추할 수 있습니다. 가장 마지막으로 초기화된 값이 프로그램 내에서 사용됩니다. 예를 들면, ④ 번의 CISTestINI.ini 파일이 없을 경우, ③ 번의 CISTestINI_default.ini 파일에 지징된 tag 값이 이용됩니다. 이 파일마저도 없다면, ② 번의 Proc_INI_InitEx() 함수 내에서 수동으로 지정한 초기값이 사용될 것입니다.

 

 

① Proc_INI_AddItem() 함수 내에서 지정된 초기값

② Proc_INI_InitEx() 함수 내에서 수동으로 지정하는 초기값

③ 파일명 CISTestINI_INI_File_DEFAULT 즉, "CISTestINI_default.ini" 파일에 지정된 tag 값

④ 파일명 CISTestINI_INI_File 즉, "CISTestINI.ini" 파일에 지정된 tag 값

 

 

CISTestINI_mod_INI.h 파일 내에서 사용된 구조체 CIS_INI 와 CISTestINI_mod_INI.c 파일 내의 각 함수 내에서 이용된 Gini.AddItemInt(), Gini.AddItemString(), Gini.AddItemDouble(), Gini.Save(), Gini.Load(), Gini.ApplyCtrl() 등의 멤버 함수들은 CISManip.dll  내에 정의된 함수들이기 때문에 CISManip.dll 관련 헤더파일과 Import Library를 현재 프로젝트에 포함시켜야합니다.

CISManip.dll 라이브러리를 사용하기 위해 CVI 정보나눔 자료실에서 CISManip.dll (v1.0.003 버전 이상)을 다운로드 받으십시오. (첨부된 파일 중 CISManip_v1.0.003.zip 파일을 다운로드 받아 현재 프로젝트 폴더에 압축해제하십시오.)

그림 3.3.6에는 CISManip_v1.0.003.zip 파일과 압축해제한 파일들을 보였습니다. 여기서 CISTestINI.prj 프로젝트에 포함시킬 파일은 CISManip.h 와 CISManip.lib 파일입니다. CISManip.dll 파일은 실행시에만 CISTestINI.exe 파일과 같은 폴더에 있으면 됩니다.

 

그림 3.3.6 CISManip.dll 관련 파일들

 

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

 

그림 3.3.6 TestINI.prj 프로젝트 창

 

이전 강좌 [강좌:44]에서 포함시켰던 inifile.fp 파일은 이제 더 이상 이 프로젝트에 포함시키지 않아도 됩니다. CISManip.dll 내에 이미 적용되었습니다.

 

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에 수정내용 ③~⑥ 까지를 보였습니다. ⑥ 수정사항은 화면을 표시하기 전의 초기화 과정과, 프로그램 종료하기 전에 마무리하는 두 부분으로 나누어 집니다. 이전 [강좌:44]에서 보였던 부분에 비하여 깔끔하게 두 개의 함수 호출로 끝나버렸습니다.

 

그림 3.4.2 CISTestINI의 main() 함수

 

Panel의 Callback 함수인 PanelCB() 함수는 수정된 것 없이 그대로입니다.

 

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

 

그림 4.1 CISTestINI 프로그램의 실행

 

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

 

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

 

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

 

마무리
이번 강좌에서는 프로그램의 설정을 ini 파일에 저장하는 과정을 CISManip.dll을 이용하여 보였습니다. 결과는 이전 강좌 [강좌:44]와 똑같지만, CISTestINI_mod_INI.c 파일 내에서의 이용법이 보다 체계화된 특징이 있습니다.

CISTestINI_mod_INI.h와 CISTestINI_mod_INI.c 파일을 CISManip.dll 관련 파일과 함께 현재 진행하고 있는 다른 프로젝트에도 적절히 수정하여 적용할 수도 있을 것입니다.

감사합니다.

 

2013-05-29 (수)

극동테크 허창원 드림

 


두둥두둥

2013.09.09 10:02:50
*.199.164.219

저번년도에 입사하여 CVI를 처음 접하게된 신입사원입니다. 해당 강좌의 글을 쭈욱 읽어보며 너무나 큰 도움이 되고있어서..

이리 감사의 글이나마 남깁니다..

중장기 강좌계획을 남긴다던 예전글에서 한인내 하신다던 글귀가 아주 인상적이었습니다.

꾸준히 강좌 남겨주셔서 정말.. 감사합니다..

허창원

2013.09.09 11:25:31
*.210.6.242

감사합니다. 힘이 됩니다.

List of Articles
번호 제목 글쓴이 날짜 조회 수
115 멀티쓰레드 사용 시, 메모리 관련 참고사항입니다. [1] 요돌이 2017-10-24 431
114 [팁]타이머 사용시 주의할점. file 이현화 2014-02-13 2025
113 Lable 세로쓰기 [1] 초보 2013-12-21 1215
» [강좌:45] ini 파일 이용하기(CISManip.dll 활용) [2] 허창원 2013-05-29 3359
111 [강좌: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 70387
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