정보의 저장
¢ 프로그램은 실행 중에 사용자가 입력한 옵션 설정이나 프로그램 스스로 만들어낸 정보들을 다음 실행을 위해 그 정보를 저장 해두어야 한다.
¢ 이런 정보는 사용자의 정보가 아니라 프로그램 자신의 정보이다
¢ 프로그램의 설정 정보를 저장하는 방법에는 INI파일을 쓰는 방법과 레지스트리를 쓰는 방법이 있다.
레지스트리의 특징
¢ 윈도우의 환경설정에 대한 모든 정보가 저장되어 관리되고 있는 Windows의 핵심적인 데이터베이스이다.
¢ 다중 환경설정을 저장할 수 있다.
¢ INI 파일과 달리 크기가 64KB를 초과할 수 있다.
¢ INI 파일에 비해 속도가 빠르다.
¢ 백업 및 복구가 간단하다.
레지스트리의 구조
¢ 레지스트리는 디렉토리 구조와 유사한 계층적 구조로 구성
¢ 각각의 가지(레지스트리 편집기에서 폴더 아이콘으로 표시되는)는 키라고 부르며, 각각의 키는 하위키를 포함할 수 있으며, 각각의 키는 값을 포함할 수 있다.
¢ 이 값에 레지스트리에 저장되는 실제 정보가 저장됨
함수정리
레지스트리 키 생성 함수
hKey : 새로 만들어지는 부모키 지정
- HKEY_CLASSES_ROOT : 응용 프로그램을 위한 OLE정보와 모든 파일유형 정보 저장
- HKEY_CURRENT_USER : 현재 로그인한 사용자를 위한 정보 저장
- HKEY_LOCAL_MACHINE : 컴퓨터에 설치된 하드웨어와 소프트웨어에 대한 모든 정보 저장
- HKEY_USERS : 컴퓨터를 사용하는 사용자 각각에 대한 속성을 저장
- HKEY_CURRENT_CONFIG : 현재 하드웨어의 설정을 저장
lpSubKey : 만들고자 하는 서브키를 지정하는 널 종료 문자열로 반드시 지정해야 함.
hKey 서브에 여기서 지정한 키가 생성됨.
Reserved : 예약된 인수, 0으로 지정
lpClass : 생성되는 키의 클래스를 지정하는 문자열
dwOptions : 생성하는 키의 옵션
- REG_OPTION_NON_VOLATILE : 레지스트리에 저장되는 정보는 파일에
영구 저장되므로 재부팅해도 정보 유지
samDesired : 보안속성
- KEY_ALL_ACCESS : 읽기, 쓰기 할 때 사용
- KEY_WRITE : 쓰기, KEY_READ : 읽기
lpSecurityAttribute : 생성된 키값이 상속될 것인가 지정하는 인수, NULL이면 상
속되지 않음
phkResult : 만들어지거나 열려진 키값이 대입되는 변수 포인터
여기에 HKEY구조체 변수를 대입
lpdwDisposition : 키가 새로 생성되었는지 기존의 키가 오픈된 것인지 리턴받기
위한 출력용 변수
열려진 키에 값을 저장하는 함수
hKey : 값을 저장하고자 하는 키 핸들(현재 열려진 키)
lpValueName : 값의 이름
Reserved : 이 인수는 사용하지 않음
dwType : 값의 데이터 타입을 지정 (대부분의 정보를 저장할 수 있다)
- REG_BINARY : 이진 데이터
- REG_SZ : 문자열
lpData : 저장하고자 하는 데이터의 포인터
cbData : 데이터의 크기
저장한 위치의 값을 읽어오는 함수
hKey : 값을 저장하고자 하는 키 핸들(현재 열려진 키)
lpValueName : 값의 이름
lpReserved : 이 인수는 사용하지 않음
lpType : 읽은 값의 타입을 대입받을 변수의 포인터
lpcbData : 실제 복사된 데이터의 크기를 리턴, 대입받을 변수의 크기를 대입
RegCreateKeyEx(), RegSetValueEx(), RegQueryValueEx() 이 함수들은 제대로 읽거나 저장
했다면 ERROR_SUCCESS(0)가 리턴 된다
열려진 레지스트리 키를 닫는 함수
레지스트리 키도 메모리를 소모하므로 사용하고 난 후에는 해제를 해야함
실습예제
#include <windows.h>
#include "resource.h"
BOOL CALLBACK DlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam);
#define CURRENT HKEY_CURRENT_USER
#define KEY "SoftWare\\Bit\\Test\\"
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nShowcmd)
{
DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),0,DlgProc);
return 0;
}
BOOL CALLBACK DlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
TCHAR str[256];
HKEY key;
DWORD dwDisp;
DWORD Size; //불러올때 사이즈
switch(iMessage)
{
case WM_INITDIALOG: break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK: //저장하기
GetDlgItemText(hDlg, IDC_EDIT1, str, 256);
RegCreateKeyEx(CURRENT, KEY"Edit",0,NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, 0,&key, &dwDisp);
RegSetValueEx(key, "STR", 0, REG_SZ, (LPBYTE)str, strlen(str)+1);
RegCloseKey(key);
break;
case IDOK2: //불러오기
RegCreateKeyEx(CURRENT, KEY"Edit",0,NULL, REG_OPTION_NON_VOLATILE,KEY_READ,0, &key, &dwDisp);
RegQueryValueEx(key, "STR", 0, NULL, (LPBYTE)str, &Size);
MessageBox(hDlg, str, "", MB_OK);
RegCloseKey(key);
break;
case IDCANCEL:
EndDialog(hDlg,IDCANCEL);
break;
}
return TRUE;
}
return FALSE;
}
'API & MFC > API & 시스템프로그래밍' 카테고리의 다른 글
리스트뷰 (0) | 2010.02.03 |
---|---|
WM_USER And WM_APP (0) | 2010.02.02 |
o/s의 role (0) | 2010.01.28 |
파일매핑예제 (0) | 2010.01.25 |
WNDCLASS 구조체 (0) | 2010.01.25 |