세상을 이롭게

[winbase.h] ini 형식 파일 작성하기 본문

C,C++

[winbase.h] ini 형식 파일 작성하기

2021. 5. 26. 14:41

ini 파일이란? Initialization file 을 의미한다. 즉 프로그램의 실행 초기에 대한 정보를 담아놓는 파일이다.
(목적과 다르게 정하는건 개발자의 마음)
https://ko.wikipedia.org/wiki/INI_%ED%8C%8C%EC%9D%BC

 

INI 파일 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. INI(Initialization) 파일 포맷은 설정 파일에 대한 de facto 표준이다. INI 파일은 단순 구조의 텍스트 파일로 이루어져 있다. 보통 마이크로소프트 윈도우와 연결되어

ko.wikipedia.org

ini 파일은 [섹션]과 매개변수 Key=Value 로 이루어진 파일이다. ;는 주석이다.
[AutoPilot]        <- 섹션
AutoControl=1   <- 매개변수
; 0이면 check FALSE(defualt), 1이면 check TRUE로 지정한다.

이런식으로 작성 된다.

작성법을 알아보자.
본인은 F1을 자주 이용하는 편이다.
VisualStrudio에서 원하는 함수에 커서를 주고 F1을 누르면 관련 문서가 등장한다.

https://docs.microsoft.com/ko-kr/windows/win32/api/winbase/nf-winbase-writeprivateprofilesectiona

 

WritePrivateProfileSectionA function (winbase.h) - Win32 apps

Replaces the keys and values for the specified section in an initialization file.

docs.microsoft.com

Write와 관련된 함수부터 살펴본다.

Adjl 

A와 W의 차이는?(WinBase.h)에서 확인해보자.

#ifdef UNICODE
#define WritePrivateProfileString  WritePrivateProfileStringW
#else
#define WritePrivateProfileString  WritePrivateProfileStringA
#endif // !UNICODE

#ifdef UNICODE
#define GetPrivateProfileSection  GetPrivateProfileSectionW
#else
#define GetPrivateProfileSection  GetPrivateProfileSectionA
#endif // !UNICODE

그렇구나....

함수의 원형을 보면?

BOOL WriteProfileString( LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpString );
BOOL WritePrivateProfileString( LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpString, LPCTSTR lpFileName );

Private가 붙은 함수는 File경로이름을 갖고 있다는 것을 알 수 있다.
Private가 붙지 않은 함수를 쓰면 win.ini에 작성된다고 한다.

필요한 것만 사용할꺼니까, 위의 형식대로 넣고싶다면
WritePrivateProfileString(_T("AutoPilot"), _T("AutoControl"), 1, path);
이렇게 써주면 된다.

이때 만약 path에 ~~\\~~.dat 이렇게 적어놓았다면 dat 파일을 열어도 똑같이 써진다.
즉 ini파일형식으로 써줄 뿐, 확장자에 따라 달라지는 것이 아니라는 소리이다.

기록된 세션의 키 벨류를 지우고 싶다면 WritePrivateProfileString(_T("AutoPilot"), NULL,"", path);
이런식으로 덮어 써줄 수 있다.

또한 섹션과 키는 대소문자 구분을 하지 않는다.
*섹션이나 키가 존재하지 않는다면 새로 만들어진다. 그래서 거의 GetPrivateProfileSection 함수와 붙어다닌다.

DWORD GetPrivateProfileString(LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpDefault, LPTSTR lpReturnedString, DWORD nSize, LPCTSTR lpFileName)
UINT GetPrivateProfileInt(LPCTSTR lpAppName, LPCTSTR lpKeyName, INT nDefault, LPCTSTR lpFileName)

사용법
char Buffer[1023] = {0};
GetPrivateProfileString("Section","KeyName","default value",Buffer,sizeof(Buffer),path);
GetPrivateProfileInt("Section","KeyName",(int형)default value,path);

ex)
GetPrivateProfileString(_T("CONFIG"), _T("COUNT"), _T("0"), szData, 100, szIni);
WritePrivateProfileString(_T("CONFIG"), _T("COUNT"), szData, szIni);