Windows 환경에서 프로그램과 관련된 설정 정보는 주로 레지스트리나 ini 파일에 저장한다. Win32에서는 ini 파일 보다는 레지스트리의 사용을 권고한다. 그래서 그런지 ATL에 레지스트리를 포장한 CRegKey 클래스는 있어도 ini 파일 함수들을 포장한 클래스는 존재하지 않는다. 런타임 정보(도킹 툴바의 위치, 설치 경로, 최근 작업한 문서 등의 그때그때 바뀌는 정보)의 경우는 레지스트리가 적합하지만, 환경정보(색상, 단축키 등의 사용자가 설정한 내용)의 저장소로는 부적합하다. 이유는 간단하다. 사용자가 찾기가 힘들기 때문이다. 멀리 갈 것도 없이 Visual Studio만 해도 그렇다. Visual Studio의 색상 정보나 단축키 정보를 찾는 것은 거의 리버싱을 하는 수준이다. 그마저도 찾지 못하면 설치할 때 마다 설정을 새로 해야 한다. 이러한 이유로 필자는 환경설정 정보를 저장하는 데는 외부 파일(ini, xml 등)을 더 선호한다.
<리스트 1>은 ini 파일 API들을 쓰기 쉽도록 포장한 클래스다. SetFile 함수로 사용할 ini 파일 이름을 기록한 다음 Read, Write를 통해서 읽고 쓸 수 있다. 간단한 API만 포장한 것이기 때문에 복잡한 ini API들은 지원하지 않는다. 전체 클래스는 http://www.jiniya.net/files/inihlpr.zip 에서 받을 수 있다.
리스트 1 Ini 파일 헬퍼 클래스
class CIniHelper
{
private:
CString m\_fileName;
BOOL m\_checked;
// 파일의 존재 유무를 체크한다.
BOOL CheckFile();
public:
CIniHelper(LPCTSTR fileName = "") { SetFile(fileName); }
void SetFile(LPCTSTR fileName);
// Ini 파일에서 int 값을 읽어온다.
int Read(LPCTSTR app, LPCTSTR key, int def)
{
return GetPrivateProfileInt(app, key, def, m\_fileName);
}
// Ini 파일에서 문자열 값을 읽어온다.
CString Read(LPCTSTR app, LPCTSTR key, LPCTSTR def)
{
TCHAR buf[260];
GetPrivateProfileString(app, key, def, buf, sizeof(buf), m\_fileName);
return CString(buf);
}
// Ini 파일에 int 값을 쓴다.
BOOL Write(LPCTSTR app, LPCTSTR key, int v)
{
if(!CheckFile())
return FALSE;
TCHAR buf[260];
StringCbPrintf(buf, sizeof(buf), "%d", v);
return WritePrivateProfileString(app, key, buf, m\_fileName);
}
// Ini 파일에 문자열 값을 쓴다.
BOOL Write(LPCTSTR app, LPCTSTR key, LPCTSTR v)
{
if(!CheckFile())
return FALSE;
return WritePrivateProfileString(app, key, v, m\_fileName);
}
// Ini 파일에 기록한 내용을 파일에 실제로 쓴다
// 기록을 한 경우 반드시 호출해 준다.
BOOL Flush();
};