HKEY_CURRENT_USER : 현재 로그인한 사용자 설정 정보. HKEY_USERS 의 서브키.
원본은 HKEY_USERS의 SID
HKEY_LOCAL_MACHINE : 컴퓨터의 물리적 구성 정보 및 시스템 전반에 대한 정보.
HKEY_CLASSES_ROOT : 파일 확장자 속성 및 COM 오브젝트 설정 정보.
원본은 HKEY_CURRENT_USER 와 HKEY_LOCAL_MACHINE 아래의
Software\Classes의 조합.
HKEY_CURRENT_CONFIG : 현재 하드웨어 설정 상태.
원본은 HKEY_LOCAL_MACHINE\System\CurrentControlSet
\Hardware Profiles\Current 임.
간단한 레지스트리 조작 샘플
#include <iostream>
#include <tchar.h>
#include <Windows.h>
using namespace std;
void printError(LONG errorno)
{
TCHAR* lpOSMsg;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
errorno,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&lpOSMsg,
0,
NULL);
_tprintf(_T("[ERROR] [%d] %s\n"), errorno, lpOSMsg);
LocalFree(lpOSMsg);
}
void print(TCHAR* msg)
{
_tprintf(msg);
}
int main(void)
{
setlocale(LC_ALL, "");
HKEY key;
DWORD dwDisp;
try
{
LONG ret;
//키 읽음(없으면 생성) : RegCreateKeyEx()
ret = RegCreateKeyEx(HKEY_CURRENT_USER, _T("Software\\AAAA\\Test"), 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key, &dwDisp);
/*
1st :대상 키(HKEY). 예약된 키들은 다음과 같다.
HKEY_CLASSES_ROOT
HKEY_CURRENT_CONFIG
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
2nd : 서브키
3rd : 미사용(0)
4th : 생성된 키의 클래스. 미지정시 NULL.
5th : 키 옵션
REG_OPTION_BACKUP_RESTORE : 6th 인수인 보안 속성 무시.
REG_OPTION_VOLATILE : 메모리 저장. (재부팅시 사라짐)
REG_OPTION_NON_VOLATILE : 영구 저장(default)
6th : 보안 속성 설정
KEY_ALL_ACCESS : STANDARD_RIGHTS_REQUIRED, KEY_QUERY_VALUE, KEY_SET_VALUE, KEY_CREATE_SUB_KEY, KEY_ENUMERATE_SUB_KEYS, KEY_NOTIFY, KEY_CREATE_LINK 조합
KEY_CREATE_LINK : 심볼릭 링크 생성 호가
KEY_CREATE_SUB_KEY : 서브키 생성 허가
KEY_ENUMERATE_SUB_KEYS : 서브키 열거 허가
KEY_EXECUTE : 읽기 허가
KEY_NOTIFY : 통지 변경 허가
KEY_QUERY_VALUE : 값 읽기 허가
KEY_READ : STANDARD_RIGHTS_READ, KEY_QUERY_VALUE, KEY_ENUMERATE_SUB_KEYS, KEY_NOTIFY 조합
KEY_SET_VALUE : 값 설정 허가
KEY_WOW64_32KEY : 32/64 bit 프로그램에서 32 bit 키 접근
KEY_WOW64_64KEY : 32/64 bit 프로그램에서 64 bit 키 접근
KEY_WRITE : STANDARD_RIGHTS_WRITE, KEY_SET_VALUE, KEY_CREATE_SUB_KEY 조합
7th : 생성된 키값이 child 프로세스로의 상속 여부. 미상속시 NULL
8th : 키값이 대입되는 변수 포인터
9th : 키 상태 리턴
REG_CREATED_NEW_KEY : 키가 새로 생성됨
REG_OPENED_EXISTING_KEY : 키가 존재함
*/
if (ret != ERROR_SUCCESS)
print(_T("RegCreateKeyEx error")), throw ret;
switch (dwDisp)
{
case REG_CREATED_NEW_KEY:
print(_T("키가 새로 생성됨\n"));
break;
case REG_OPENED_EXISTING_KEY:
print(_T("키가 존재함\n"));
break;
}
//키 읽음(없으면 에러) : RegOpenKeyEx()
ret = RegOpenKeyEx(HKEY_CURRENT_USER, _T("Software\\AAAA\\Test"), 0,KEY_ALL_ACCESS, &key);
/*
1st : RegCreateKeyEx()의 1st 와 동일.
2nd : RegCreateKeyEx()의 2nd 와 동일
3rd : RegCreateKeyEx()의 3rd 와 동일.
4th : RegCreateKeyEx()의 6th 와 동일.
5th : RegCreateKeyEx()의 8th 와 동일.
*/
if (ret != ERROR_SUCCESS)
print(_T("RegOpenKeyEx error")), throw ret;
//키 값 쓰기 : RegSetValueEx()
TCHAR* inValue = _T("레지스트리 저장하기");
DWORD inValueBytes = lstrlen(inValue) * sizeof(TCHAR);
ret = RegSetValueEx(key, _T("testKey"), 0, REG_SZ, (LPBYTE)inValue, inValueBytes);
/*
1st : RegCreateKeyEx()의 1st 와 동일.
2nd : RegCreateKeyEx()의 2nd 와 동일
3rd : RegCreateKeyEx()의 3rd 와 동일
4th : 저장될 키 값의 타입
REG_BINARY : 바이너리 데이터
REG_DWORD : 32 bit 숫자
REG_DWORD_LITTLE_ENDIAN : 32bit 리틀 인디안 숫자.(윈도우는 리틀 인디안)
REG_DWORD_BIG_ENDIAN : 32bit 빅 인디안 숫자(몇몇 UNIX의 빅 인디안을 위한 값)
REG_EXPAND_SZ : 환경변수값이 확장되지 않는 널 종료 문자열 (ex. %PATH%). 환경변수 확장은 ExpandEnvironmentStrings() 참조.
REG_LINK : 시스템에서 사용하기 위해 예약됨.
REG_MULTI_SZ : 널 종료 문자열의 배열. (ex. String1\0LastString\0\0)
REG_NONE : 정의되지 않은 타입
REG_QWORD : 64 bit 숫자
REG_QWORD_LITTLE_ENDIAN : 64 bit 리틀 인디안 숫자
REG_SZ : null 종료 문자열
5th : 저장될 값.
6th : 저장될 값의 bytes.
*/
if (ret != ERROR_SUCCESS)
print(_T("RegSetValueEx error")), throw ret;
//키 값 읽음 : RegQueryValueEx()
TCHAR outValue[568];
DWORD outValueBytes;
ret = RegQueryValueEx(key, _T("testKey"), 0, NULL, (LPBYTE)outValue, &outValueBytes);
/*
1st : RegCreateKeyEx()의 1st 와 동일.
2nd : 읽어올 키 값의 이름.
3rd : RegCreateKeyEx()의 3rd 와 동일.
4th : 키 값의 타입을 넣을 변수 포인터. 불필요시 NULL.
5th : 읽어들인 키 값의 주소.
6th : 읽어들인 키 값의 bytes.
*/
if (ret == ERROR_MORE_DATA)
print(_T("5th 인수인 lpData 크기가 너무 작음")), throw ret;
if (ret != ERROR_SUCCESS)
print(_T("RegQueryValueEx error")), throw ret;
TCHAR msg[1024];
wsprintf(msg, _T("val : %s, bytes : %d\n"), outValue, outValueBytes);
print(msg);
//키 값 삭제 : RegDeleteValue()
ret = RegDeleteValue(key, _T("testKey"));
/*
1st : RegCreateKeyEx()의 1st 와 동일.
2nd : 읽어올 키 값의 이름.
*/
if (ret != ERROR_SUCCESS)
print(_T("RegDeleteValue error")), throw ret;
//키 삭제 : RegDeleteKey()
ret = RegDeleteKey(HKEY_CURRENT_USER, _T("Software\\AAAA\\Test"));
/*
1st : RegCreateKeyEx()의 1st 와 동일.
2nd : RegCreateKeyEx()의 2nd 와 동일.
*/
if (ret != ERROR_SUCCESS)
print(_T("RegDeleteKey error")), throw ret;
// 키 해제 : RegCloseKey()
ret = RegCloseKey(key);
if (ret != ERROR_SUCCESS)
print(_T("RegCreateKeyEx error")), throw ret;
}
catch (LONG errorno)
{
printError(errorno);
}
return 0;
}