정보의 저장

¢  프로그램은 실행 중에 사용자가 입력한 옵션 설정이나 프로그램 스스로 만들어낸 정보들을 다음 실행을 위해 그 정보를 저장 해두어야 한다.

¢  이런 정보는 사용자의 정보가 아니라 프로그램 자신의 정보이다

¢  프로그램의 설정 정보를 저장하는 방법에는 INI파일을 쓰는 방법과 레지스트리를 쓰는 방법이 있다.



레지스트리의 특징

¢  윈도우의 환경설정에 대한 모든 정보가 저장되어 관리되고 있는 Windows의 핵심적인 데이터베이스이다.

¢  다중 환경설정을 저장할 수 있다.

¢  INI 파일과 달리 크기가 64KB를 초과할 수 있다.

¢  INI 파일에 비해 속도가 빠르다.

¢  백업 및 복구가 간단하다.

 

레지스트리의 구조

 

¢  레지스트리는 디렉토리 구조와 유사한 계층적 구조로 구성

¢  각각의 가지(레지스트리 편집기에서 폴더 아이콘으로 표시되는)는 키라고 부르며, 각각의 키는 하위키를  포함할 수 있으며, 각각의 키는 값을 포함할 수 있다.

¢  이 값에 레지스트리에 저장되는 실제 정보가 저장됨



함수정리

레지스트리 키 생성 함수

LONG RegCreateKeyEx(HKEY hKey, LPCTSTR lpSubKey, DWORD Reserved,                                   LPTSTR lpClass, DWORD dwOptions, REGSAM Desired, LPSECURITY_ATTRIBUTES lpSecurity, PHKEY hkResult, LPDWORD lpdwDisposition);


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 : 키가 새로 생성되었는지 기존의 키가 오픈된 것인지 리턴받기

                         위한 출력용 변수


열려진 키에 값을 저장하는 함수

LONG RegSetValueEx(HKEY hKey, LPCTSTR lpValueName, DWORD Reserved,  DWORD dwType, CONST BYTE *lpData, DWORD cbData);


hKey :
값을 저장하고자 하는 키 핸들(현재 열려진 키)

lpValueName : 값의 이름

Reserved : 이 인수는 사용하지 않음

dwType : 값의 데이터 타입을 지정 (대부분의 정보를 저장할 수 있다)

    - REG_BINARY : 이진 데이터

    - REG_SZ : 문자열

lpData : 저장하고자 하는 데이터의 포인터

cbData : 데이터의 크기


저장한 위치의 값을 읽어오는 함수

LONG RegQueryValueEx(HKEY hKey, LPTSTR lpValueName, LPDWORD lpReserved,                          LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData);


hKey :
값을 저장하고자 하는 키 핸들(현재 열려진 키)

lpValueName : 값의 이름

lpReserved : 이 인수는 사용하지 않음

lpType : 읽은 값의 타입을 대입받을 변수의 포인터

lpcbData : 실제 복사된 데이터의 크기를 리턴, 대입받을 변수의 크기를 대입

RegCreateKeyEx(), RegSetValueEx(), RegQueryValueEx() 이 함수들은 제대로 읽거나 저장

                                                                   했다면 ERROR_SUCCESS(0)가 리턴 된다



열려진 레지스트리 키를 닫는 함수


 

LONG RegCloseKey(HKEY hKey);

레지스트리 키도 메모리를 소모하므로 사용하고 난 후에는 해제를 해야함



실습예제

#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
Posted by 아몰라