윈도우즈에서 설정 파일을 저장하기 위해서 디렉토리를 복사하면 설정이 같이 복사될 수 있는 ini파일을 선호하는 편이다.
그런데 CE에서는 ini를 다루는 api가 없는게 아닌가!?!?
왜 뺐지.. 이것도 추가하려면 돈 받나? 아니면 그냥 레지스트리 써라라고 압박하는 건가..
아무튼 프로그램을 다 뜯어 고치기 싫어서 윈CE용 ini 읽기와 쓰기 함수를 만들어 버렸다.
DWORD GetPrivateProfileString(LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpDefault, LPTSTR lpReturnedString, DWORD nSize, LPCTSTR lpFileName)
BOOL WritePrivateProfileString(LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpString, LPCTSTR lpFileName)
결국 요 2개의 함수만 만들면 되는거니까..
숫자나 다른 type은 문자열을 적절히 변환해서 쓰기로 하고,
윈도우즈 api에 있는 위의 2개의 함수를 똑같이 만들어서 사용했다.
다만 정상적이지 않은 ini파일에 대해서 작동을 보장하지는 않는다.
more..
#ifdef WINCE
DWORD
GetPrivateProfileString(LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR
lpDefault, LPTSTR lpReturnedString, DWORD nSize, LPCTSTR lpFileName)
{
TCHAR ch;
bool search = true;
bool find = false;
int state = 0;
int idx = 0;
FILE* fp = _tfopen(lpFileName, _T("rt"));
if (fp == NULL)
search = false;
while (search && 1 == _ftscanf(fp, _T("%c"), &ch))
{
switch (state)
{
case 0: // 첫글자
if (ch == _T(';'))
state = 10; // 주석넘기기
else if (ch == _T('['))
{
idx = 0;
lpReturnedString[0] = 0;
state = 20; // AppName 비교
}
break;
case 10:
if (ch == _T('\n'))
state = 0;
break;
case 20:
if (ch == _T(']'))
{
lpReturnedString[idx++] = 0;
if (_tcscmp(lpReturnedString, lpAppName) == 0)
{
idx = 0;
lpReturnedString[0] = 0;
state = 30;
}
else
state = 10;
}
else
lpReturnedString[idx++] = ch;
break;
case 30:
if (ch == _T('\n'))
state = 31;
break;
case 31:
if (ch == _T('['))
search = false;
else if (ch == _T(';'))
state = 30;
else
{
idx = 0;
lpReturnedString[idx++] = ch;
state = 32;
}
break;
case 32:
if (ch == _T('='))
{
lpReturnedString[idx++] = 0;
if (_tcscmp(lpReturnedString, lpKeyName) == 0)
{
idx = 0;
lpReturnedString[0] = 0;
state = 40;
}
else
state = 30;
}
else
lpReturnedString[idx++] = ch;
break;
case 40:
if (ch == _T('\n'))
{
lpReturnedString[idx++] = 0;
search = false;
find = true;
}
else
lpReturnedString[idx++] = ch;
break;
}
}
if (!find)
_tcscpy(lpReturnedString, lpDefault);
if (fp != NULL)
fclose(fp);
return _tcslen(lpReturnedString);
}
BOOL WritePrivateProfileString(LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpString, LPCTSTR lpFileName)
{
cString out;
cString str;
TCHAR ch;
bool search = true;
bool app = false;
bool find = false;
int state = 0;
int idx = 0;
FILE* fp = _tfopen(lpFileName, _T("rt"));
if (fp == NULL)
search = false;
else
{
while (1 == _ftscanf(fp, _T("%c"), &ch))
out += ch;
fclose(fp);
}
for (int i = 0; search && i < out.length(); i++)
{
ch = out[i];
switch (state)
{
case 0: // 첫글자
if (ch == _T(';'))
state = 10; // 주석넘기기
else if (ch == _T('['))
{
idx = 0;
str.clear();
state = 20; // AppName 비교
}
break;
case 10:
if (ch == _T('\n'))
state = 0;
break;
case 20:
if (ch == _T(']'))
{
if (str.compare(lpAppName) == 0)
{
idx = 0;
str.clear();
state = 30;
app = true;
}
else
state = 10;
}
else
str += ch;
break;
case 30: // AppName이일치한후
if (ch == _T('\n'))
state = 31;
break;
case 31:
if (ch == _T('['))
{ // 다른AppName이시작한다면여기에삽입
str.format(_T("%s=%s\n"), lpKeyName, lpString);
out.ins(i, str);
search = false;
find = true;
}
else if (ch == _T(';'))
state = 30;
else
{
idx = 0;
str += ch;
state = 32;
}
break;
case 32:
if (ch == _T('='))
{
if (str.compare(lpKeyName) == 0)
{
idx = 0;
str.clear();
state = 40;
}
else
{
str.clear();
state = 30;
}
}
else
str += ch;
break;
case 40: // KeyName이일치한후
if (ch == _T('\n'))
{
out.replace(i - str.length(), str.length(), lpString);
search = false;
find = true;
}
else
str += ch;
break;
}
}
if (!find) // AppName도KeyName도찾지못했다면
{
if (out.length() > 0)
{
ch = out[out.length()-1];
if (ch != _T('\n'))
out += _T('\n');
}
if (!app)
{
str.format(_T("[%s]\n"), lpAppName);
out += str;
}
str.format(_T("%s=%s\n"), lpKeyName, lpString);
out += str;
}
fp = _tfopen(lpFileName, _T("wt"));
if (fp == NULL)
return FALSE;
fprintf(fp, out.bstr());
fclose(fp);
return TRUE;
}
'스킬북 > 코드 조각' 카테고리의 다른 글
| WinCE Standard SDK 5.0의 sipapi의 눈속임 (0) | 2007/10/19 |
|---|---|
| 윈CE에서 ini파일 사용하기.. (5) | 2007/08/02 |
| 색상 형식 간의 변환 (0) | 2007/04/10 |
| 파일 선택 대화상자 띄우기 (0) | 2007/04/07 |


ce_ini.h
|꼬마늑대|


댓글을 달아 주세요
아 너무 감사~
구글링 후 좌절하여 직접 만드려는 찰라에 ^^;;
잘쓸께요...
오~~ 역시 구글링을 통해 수확이..ㅎㅎㅎ
'직접 구현하는...'
저랑 똑같은 생각을 하셨군요..
하지만 님은 실제 행동으로 옮기셨으니 저보다 대단하심..ㅎㅎㅎ
감사합니다. CE로 포팅을 하다가 함수가 없어서 찾아보다가 구글링하게 되었네요. 소스코드 수정해서 제 블로그에 올려도 가능할까요?
네 괜찮습니다.
수정한 내용 저도 볼 수 있게 트랙백 걸어주세요.
그런데 아직도 CE 프로그래밍을 하는 곳이 있나요?
트랙백을 어떻게 거는지 몰라서 홈페이지 주소로 연결해 놓았는데...
http://wapi.springnote.com/pages/8474102
입니다.