특정 값이나, 상황, 옵션등을 설정하고 싶을 때, 프로그램 코드에서 설정하거나, 사용자에게 입력받는 방법도 존재 하지만,
모든 상황에 대해서 그 값을 입력받는다거나, 확인하는 작업이 그렇게 편리하지만은 않다.
그래서 존재 하는 것이 ini파일의 활용인데, (확장자만 바꾸면 꼭 ini가 아니여도 상관은 없지만, 보통 확장자를 ini로 많이 사용한다.)
크게 ini파일을 만들면,
세션 과 키값, 그리고 데이터로 분리된다.
[TEST1]
HP=1
MP=2
라는 식을 ini 파일이 가지고 있다고 했을 때
TEST1은 세션
HP, MP는 키값
1과 2는 데이터라고 보면 된다.
크게 어려운 것은 없고.
WritePrivateProfileString 를 사용해 세션을 만들고, 키 값을 만들고, 데이터를 삽입한다.
이 함수는 4개의 인자가 들어가는데, 세션, 키, 데이터, 파일의 (저장될)주소라고 보면 된다.
그리고
GetPrivateProfileString는
세션, 키, 데이터를 추출하지 못하였을때의 기본값, String의 저장 위치, 저장하는 곳의 공간, 파일의 주소
를 인자로 받게 되며 함수명에서 볼 수 있듯이, 파일에서 문자열을 받아 오기 위한 함수이다.
반대로
GetPrivateProfileInt는
세션, 키, 데이터가 저장된 장소, 파일의 주소를 인자라 보내주면
int형 값을 반환한다.
예제를 보면 훨씬 이해가 빠를 것이다.
#include <windows.h>
LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );
HINSTANCE g_hInst;
LPCTSTR lpszClass = TEXT("Ini파일");
int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpszCmdParam, int nCmdShow )
{
HWND hWnd;
MSG Message;
WNDCLASS WndClass;
g_hInst = hInstance;
WndClass.cbClsExtra = 0;
WndClass.cbWndExtra = 0;
WndClass.hbrBackground = (HBRUSH)GetStockObject( COLOR_WINDOW+1 );
WndClass.hCursor = LoadCursor( NULL, IDC_ARROW );
WndClass.hIcon = LoadIcon( NULL, IDI_APPLICATION );
WndClass.hInstance = hInstance;
WndClass.lpfnWndProc = WndProc;
WndClass.lpszClassName = lpszClass;
WndClass.lpszMenuName = NULL;
WndClass.style = CS_HREDRAW | CS_VREDRAW;
RegisterClass( &WndClass );
hWnd = CreateWindow(lpszClass, lpszClass, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, (HMENU)NULL, hInstance, NULL );
ShowWindow( hWnd, nCmdShow );
while( GetMessage( &Message, NULL, 0, 0 ) )
{
TranslateMessage( &Message );
DispatchMessage( &Message );
}
return (int)Message.wParam;
}
LRESULT CALLBACK WndProc( HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam )
{
static int nBuff;
TCHAR szBuff[80], szBuffer[256];
switch(iMessage)
{
case WM_KEYDOWN:
switch(wParam)
{
case 'A' :
WritePrivateProfileString(L"TEST", L"STR", L"This is Test",
L"..\\test123.ini");
WritePrivateProfileString(L"TEST", L"INT", L"92",
L"..\\test123.ini");
WritePrivateProfileString(L"TEST2", L"STR", L"This is Test",
L"..\\test123.ini");
WritePrivateProfileString(L"TEST2", L"INT", L"92",
L"..\\test123.ini");
WritePrivateProfileString(L"TEST3", L"STR1", L"This iasdfs Test",
L"..\\test123.ini");
WritePrivateProfileString(L"TEST3", L"INT1", L"921",
L"..\\test123.ini");
WritePrivateProfileString(L"TEST3", L"STR2", L"Thisdfs is Test",
L"..\\test123.ini");
WritePrivateProfileString(L"TEST3", L"INT2", L"912",
L"..\\test123.ini");
break;
case 'S' :
GetPrivateProfileString(L"TEST", L"STR",L"ERROR", szBuff, 80,
L"..\\test123.ini");
nBuff = GetPrivateProfileInt(L"TEST", L"INT", nBuff,
L"..\\test123.ini");
wsprintf(szBuffer, L"%s : %d", szBuff, nBuff);
MessageBox(hWnd, szBuffer, L"", MB_OK);
break;
}
return 0;
case WM_DESTROY :
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd, iMessage, wParam, lParam);
}
소스를 실행하면, 경로에 의해 파일이 생성되고,
파일의 내용은
[TEST]
STR=This is Test
INT=92
[TEST2]
STR=This is Test
INT=92
[TEST3]
STR1=This iasdfs Test
INT1=921
STR2=Thisdfs is Test
INT2=912
다음과 같다.
// 실행 화면
A키를 누르고 S키를 누르게 되면 다음처럼 나온다.
만약 A키를 누르지 않고(즉 파일을 생성하지 않고) S키를 누르면
메시지는 ERROR,0 을 출력할 것이다.(단, 한번이라도 생성이 되었다면 파일이 삭제 되지 않는 이상은 옳바른 결과를 출력할 것이다.)
'프로그래밍 > API' 카테고리의 다른 글
API-GetAsyncKeyState( 키보드 입력함수 ) (1) | 2010.06.28 |
---|---|
API-알파값(비트맵 이미지 투명화) (0) | 2010.05.10 |
API-애니메이션 (0) | 2010.05.10 |
API-PlaySound (0) | 2010.05.10 |
API-더블 버퍼링 (0) | 2010.05.10 |