배움터  
  HOME > 배움터 > Daily Tip
Daily Tip

제품:   Excel 버전:   공통
검색어:   INI,레지스트리
제목:   ini파일, 복직(復職)하다
     
 

새 페이지 1

  STEP> INI 파일 살펴보기

지금은 레지스트리를 많이 이용하지만 ini파일은 초창기 윈도우에서 지금의 레지스트리가 하는 일을 하였습니다. 물론 지금도 레지스트리 대신 ini파일을 이용할 수 있습니다. 즉 만들기 나름이라는 뜻입니다.

간단한 사용 예를 든다면 ini파일에 마지막 종료시 화면좌표등을 기록하고 프로그램 재실행시 ini파일에 기록된 화면좌표대로 프로그램의 위치를 지정하는 것이 대표적입니다.

ini파일을 다루기 전에 ini구조를 살펴보면 다음과 같습니다.

         [섹션]
         키워드=값

ini 파일의 각 섹션 이름은 대괄호([]) 사이에 있으며 이는 카테고리의 역할이라고 보면 됩니다. 그리고 다음에는 구체적으로 저장하는 값 이름과 값이 오게 됩니다. 변수와 변수값처럼 말이죠.

아주 단순합니다. 그래서 저는 ini파일을 좋아 합니다. ini 파일은 인쇄 가능한 파일이므로 텍스트 편집기만 있으면 그 설정을 바꿀 수 있습니다.

그러나 ini파일은 다음과 같은 문제점들 때문에 Microsoft는 Windows95를 출시하면서 ini파일을 해고시키고 그 임무를 레지스트리에게 맡겼습니다.
   
1. 파일의 크기는 32KB이상이면 불안정합니다.

2. 파일의 크기가 커지면 액세스가 오래 걸립니다

3. 섹션과 그 이하 값만 가지고는 복잡한 설정을 표현하기에는 부적당합니다.

4. 네트워크를 통해 원격으로 액세스하는 것이 어렵습니다.

자신의 프로그램에서 ini파일을 다루려면 두 가지의 API함수를 사용합니다.

API함수를 사용해야 합니다 라는 말을 듣고 문득 이런 생각도 드시는 분도 계실 겁니다. 일반 텍스트파일이면 저수준 파일 입출력 기능 또는 FSO(File System Object)같은 거 쓰면 되지 API함수까지 사용해야 하나?

그러나 간단한 구조의 섹션과 키워드 등을 읽어 들이고 쓰려고 해도 많은 시행착오와 수고가 필요합니다. 간단하게 다음과 같은 API함수 한 줄이 낫겠죠!

GetPrivateProfileString

Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long

WritePrivateProfileString

Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long

GetPrivateProfileString()함수는 ini파일에 저장한 설정을 읽어서 돌려줍니다. WritePrivateProfileString()함수는 ini파일에 설정을 저장합니다.

GetPrivateProfileString()함수의 매개변수를 살펴보면 다음과 같습니다.

l        lpApplicationName As String
- 섹션의 이름

l        lpKeyName As Any
- 키워드 명

l        lpDefault As String
- 읽기에 실패하는 경우 사용할 디폴트값

l        lpReturnedString As String
- 값을 저장할 변수명

l        nSize As Long
- 저장할 변수의 크기

l        lpFileName As String
- ini파일의 경로와 이름

제가 만드는 프로그램의 일부를 살펴보면 다음과 같습니다. 저는 다음의 코드를 사용하여 ini파일에 데이터베이스가 언제부터 언제까지 업데이트 되었는지를 읽어 들입니다.

Dim sDate1 As String
Dim sDate2 As String

'// 설정값을 저장하기 위해 필요한 크기+1바이트 공간을 확보한다.
'// 마지막 1바이트는 null문자를 저장하기 위한 것이다.
'// API함수는 c언어를 이용하여 만든 것인데,
'// c언어에서는 스트링의 마지막 바이트에 null값을 추가하여
'// 문자열의 끝임을 알린다.
sDate1 = Space(11)
sDate2 = Space(11)

'// PairWorm.ini파일의 [Database]섹션에서 “UpdateFrom” 키워드 값을
'// 읽어 sDate1변수에 저장한다.
'// 만일 실패하면 sDate1변수에 "2000-01-04"값을 대신 저장한다.
GetPrivateProfileString "Database", "UpdateFrom", "2000-01-04", sDate1, Len(sDate1), "PairWorm.ini"

GetPrivateProfileString "Database", "UpdateTo", "2003-08-14", sDate2, Len(sDate2), "PairWorm.ini"

 

반대로 ini파일에 설정을 기록한다면 WritePrivateProfileString()함수를 사용합니다. WritePrivateProfileString()함수의 매개변수를 살펴보면 다음과 같습니다.
 lpApplicationName As String
- 섹션의 이름
 lpKeyName As Any
- 키워드 명
 lpString As Any
- 변수 명
 lpFileName As String
- ini파일의 경로와 이름

'// PairWorm.ini파일의 [Database]섹션에서 UpdateTo키워드의 값을 저장한다.
WritePrivateProfileString "Database", "UpdateTo", "2003-09-08"), "PairWorm.ini"
 
  참고> 레지스트리란 무엇인가?
레지스트리란 윈도우 환경설정에 대한 모든 정보가 저장되어 데이터 베이스입니다.