본문 바로가기

C, C++, C#/Tip

GetPrivateProfileString, GetPrivateProfileInt 주의사항

반응형

 

목적

ini파일을 사용하면서 발생한 주의사항 포스팅

 


프로그램을 개발하다보면 ini파일을 사용하는 경우가 있었습니다.

간략하게 설명하면 ini는 [파일경로], [Section], [Key]로 구분지어 텍스트에 입력한 값을 사용하는 역할을 합니다.

해당 정보를 얻어오기 위해 GetPrivateProfileString, GetPrivateProfileInt, GetPrivateProfileSection 등과 같은 함수를 사용하여 간단하게 INI 정보를 가져올 수 있습니다.

Info.txt

[NETWORK]
IP=127.0.0.1
PORT=50003
파일경로 : Info.txt
Section : NETWORK
KEY : IP
Output -> 127.0.0.1

 

저는 윈도우 환경의 실행경로에 있는 INI파일을 사용 할 때 문제가 발생했습니다. 이 문제가 어려운 점이 파일을 다시 저장해보면 되는 경우가 있어서 더욱 이유를 알기 어려웠습니다. 문제는 GetPrivateProfileString의 파일 경로를 상대 경로로 입력하여 발생한 오류였습니다.

 


INI파일 이용 시 오류 발생 대처 및 주의 사항

1. 파일경로, Section, Key를 확인한다.(대소문자도 확인!)
2. 파일경로 입력 시 절대경로를 입력다.
 - stackoverflow를 보니 굳이 실행 경로의 INI를 이용하고 싶으면 파일경로를 절대경로로 입력을 추천하였다.
3. 윈도우 자체적으로 관리되는 INI파일은 레지스트레이서 관리한다.
  레지스트리 INI : HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ IniFileMapping

출처 : https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-getprivateprofilestring
4. 응용프로그램 경로보다는 권장사항으로 윈도우의 특수 폴더에 INI를 놓고 사용하는 것을 권장한다.
  4.1 특수 폴더란 것은 내문서, 사진, System, Windows 등과 같은 경로이다.
  4.2 특수 폴더의 경로를 얻어오는 방법은 SHGetSpecialFolderPath를 통해 얻어오는 것이다.
ex)
TCHAR sz[MAX_PATH];
SHGetSpecialFolderPath(NULL, sz, CSIDL_XXXX, FALSE);

CSIDL_XXXX : 특수 폴더 전처리 변수

개인 적으로 하단 링크에 CSIDL_XXXX 관련 전처리 변수가 정리가 잘 되어 있다.
출처 : https://ldevil63.tistory.com/26
 

  

 

 

반응형