티스토리 뷰

Visual Studio 2012 사용


레지스트리를 활용하여 값을 저장 또는 불러오자.

사용되는 모든 함수들은 CWinApp의 멤버함수로 정의되어 있다.


1. 레지스트리 키


1) 함수원형


void SetRegistryKey(LPCTSTR lpszRegistryKey);  
void SetRegistryKey(UINT nIDRegistryKey);
HKEY GetAppRegistryKey(CAtlTransactionManager* pTM = NULL);


SetRegistryKey를 통해 메인App의 키를 생성한다.

lpszRegistryKey를 통해 생성할 키의 이름을 직접 적거나,

nIDRegistryKey를 통해 키의 이름을 포함하는 문자열 리소스 ID를 활용할 수 있다.


생성한 키는 레지스트리의 HKEY_CURRENT_USER\Software\해당키이름으로 생성된다.

GetAppRegistryKey로 생성된 메인App의 HKEY를 받는다.


* 추가로 추후에 레지스트리를 쓰거나 사용할 때는 프로젝트 명의 키가 하나더 추가가 되어 사용되어진다.

ex) HKEY_CURRENT_USER\Software\Key1\Key2\

Key1: SetRegistryKey() 함수 안에 들어가는 이름

Key2: 프로젝트 명


여기서 프로젝트 명에 해당되는 Key2의 부분을 바꾸고 싶다면

리소스 뷰의 String Table에서 아래의 ID를 추가한다

AFX_IDS_APP_TITLE


위의 ID에 저장되어지는 캡션에 따라 Key2가 바뀐다. 저 값이 없을 시는 프로젝트 명이 기본으로 저장된다.


2) 적용


SetRegistryKey는 보통 MFC프로젝트를 생성하면 아래와 같이 자동으로 입력되어있다.

App클래스의 InitInstance() 함수를 보자.


//main.cpp
//...
BOOL CMainApp::InitInstance()
{
	//...
	// 표준 초기화
	// 이들 기능을 사용하지 않고 최종 실행 파일의 크기를 줄이려면
	// 아래에서 필요 없는 특정 초기화
	// 루틴을 제거해야 합니다.
	// 해당 설정이 저장된 레지스트리 키를 변경하십시오.
	// TODO: 이 문자열을 회사 또는 조직의 이름과 같은
	// 적절한 내용으로 수정해야 합니다.
	SetRegistryKey(_T("DemoProg"));

	//...
	return FALSE;
}
//...


위와 같이 레지스트리 키를 설정하면, HKEY_CURRENT_USER\Software\DemoProg로 레지스트리가 적용된다.


GetAppRegistryKey는 아래와 같이 사용한다.


//maindlg.cpp
//...
HKEY mainKey = AfxGetApp()->GetAppRegistryKey();
//...


GetAfxApp()을 활용하여 MainApp의 CWinApp 포인터를 받아와서 사용한다.


2. 레지스트리 값 쓰기


1) 함수원형


BOOL WriteProfileBinary(LPCTSTR lpszSection, LPCTSTR lpszEntry,LPBYTE pData,UINT nBytes);
BOOL WriteProfileInt(LPCTSTR lpszSection, LPCTSTR lpszEntry, int nValue);
BOOL WriteProfileString(LPCTSTR lpszSection,LPCTSTR lpszEntry, LPCTSTR lpszValue);


쓸수 있는 값의 데이터 형은 2진수, 정수, 문자열이 가능하다.

lpszSection을 통해 내부 키 이름을 정한다.

lpszEntry를 통해 내부 키 안에 Entry 이름을 정한다.

2진수에서 pData를 통해 Entry에 쓸 데이터를 가리키고, nByte를 통해 쓸 바이트 수를 명시한다.

정수로는 nValue를 통해 Entry에 쓸 정수값을 입력한다.

문자열은 lpszValue를 통해 Entry에 쓸 문자열을 입력한다.


2) 적용


//maindlg.cpp
//...
	double myData = 123.456e12;
	AfxGetApp()->WriteProfileBinary(_T("Binary"), _T("BinaryData"), (LPBYTE)&myData, sizeof(myData));
	AfxGetApp()->WriteProfileInt(_T("Int"), _T("IntData"), 3);
	AfxGetApp()->WriteProfileStringW(_T("String"), _T("StringData"), _T("hello"));
//...


위와같이 적용했을 때

HKEY_CURRENT_USER\Software\DemoProg\Binary키에 myData값을 가지고 있는 BinaryData Entry가 생성된다.

HKEY_CURRENT_USER\Software\DemoProg\Int키에 정수 값 3을 가지고 있는 IntData Entry가 생성된다.

HKEY_CURRENT_USER\Software\DemoProg\String키에 "hello" 문자열을 가지고 있는 StringData Entry가 생성된다.


3. 레지스트리 값 읽기


1) 함수원형


BOOL GetProfileBinary(LPCTSTR lpszSection, LPCTSTR lpszEntry, LPBYTE* ppData, UINT* pBytes);
BOOL GetProfileInt(LPCTSTR lpszSection, LPCTSTR lpszEntry, int nDefault);
BOOL GetProfileString(LPCTSTR lpszSection,LPCTSTR lpszEntry, LPCTSTR lpszDefault = NULL));


레지스트리 쓰는 함수와 비슷하다.

lpszSection을 통해 읽을 키 이름을 정한다.

lpszEntry를 통해 lpszSection키 안에 읽을 Entry 이름을 정한다.

GetProfileBinary에서 ppData를 통해 Entry에 읽어올 데이터의 주소를 수신하는 포인터를 가리키고, pByte를 통해 크기의 데이터를 수신할 UINT를 가리킨다.

GetProfileInt에서는 nDefault를 통해 해당 Entry를 찾을수 없는 경우 반환할 기본 값을 지정한다.

GetProfileString에서는 lpszDefault를 통해 해당 Entry를 찾을수 없는 경우 반환할 기본 문자열을 지정한다.(기본값 NULL)


2) 적용


//maindlg.cpp
//...
	double* pData;
	UINT n;
	BOOL ret = AfxGetApp()->GetProfileBinary(_T("Binary"), _T("BinaryData"), (LPBYTE*)&pData, &n);

	int nValue;
	nValue = AfxGetApp()->GetProfileInt(_T("Int"), _T("IntData"), 0);

	CString strValue;
	strValue = AfxGetApp()->GetProfileString(_T("String"), _T("StringData"));
//...


GetProfileBinary를 통해 pData에 해당 Entry의 주소를 수신하는 포인터를 받고, 데이터 크기를 n에 저장한다.

GetProfileInt를 통해 nValue에 해당 Entry의 값을 불러온다. 불러오지 못할 시 0을 반환한다.

GetProfileString을 통해 strValue에 해당 Entry의 문자열을 불러온다, 불러오지 못할시 NULL을 반환한다.


댓글