안녕하세요 저번 글에서 프로그램에서 설정을 ini로 저장하는 방법을 해봤었는데, 이번엔 레지스트리를 만들어보는 것을 해보겠습니다.
윈도우 + R키를 눌러 Regedit를 입력하여 레지스트리 편집기를 실행시켜 봅니다.

아래 이미지처럼 실행 되면 됩니다.

이번 글에서는 제일 많이 사용하고 기본적인 HKEY_LOCAL_MACHINE에 TEST_REG를 만들어 보겠습니다.
프로젝트 하나 생성해 주셔서 프로젝트 속성을 아래와 같이 설정합니다.

리소스 뷰에서 아래와 같이 만들어 줍니다.

헤더파일에 아래 값을 선언합니다.
HKEY m_hRegKey;
RegCreateKeyEx 버튼을 더블 클릭 하여 아래와 같이 코딩합니다.
void CMFCApplication1Dlg::OnBnClickedButton1()
{
DWORD dwDisp = 0;
LSTATUS lstRes = ::RegCreateKeyEx(
HKEY_LOCAL_MACHINE,
_T("SOFTWARE\\TEST_REG"),
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS | KEY_WOW64_64KEY,
NULL,
&m_hRegKey,
&dwDisp );
if ( ERROR_SUCCESS == lstRes )
{
AfxMessageBox( _T( "Create" ) );
}
else
{
AfxMessageBox( _T( "Create Fail" ) );
}
}
RegCreateKeyEx을 하면 아래 이미지와 같이 경로가 생성 됩니다.

RegOpenKeyEx 버튼을 더블클릭 하여 아래와 같이 코딩합니다.
void CMFCApplication1Dlg::OnBnClickedButton2()
{
LSTATUS lstRes = ERROR_SUCCESS;
lstRes = ::RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
_T( "SOFTWARE\\TEST_REG" ),
0,
KEY_ALL_ACCESS | KEY_WOW64_64KEY,
&m_hRegKey );
if ( ERROR_SUCCESS == lstRes )
{
AfxMessageBox( _T( "open" ) );
}
else
{
AfxMessageBox( _T( "open Fail" ) );
}
}
Create를 하면 HKEY가 얻어지지만 기존에 존재하는 레지스트리를 열어보려면 OpenKey 함수를 사용하시면 됩니다.
RegDeleteKeyEx 버튼을 더블클릭 하여 아래와 같이 코딩합니다.
void CMFCApplication1Dlg::OnBnClickedButton3()
{
LSTATUS lstRes = ERROR_SUCCESS;
lstRes = ::RegDeleteKeyEx(
HKEY_LOCAL_MACHINE,
_T( "SOFTWARE\\TEST_REG" ),
KEY_WOW64_64KEY,
0 );
if ( ERROR_SUCCESS == lstRes )
{
AfxMessageBox( _T( "delete" ) );
m_hRegKey = NULL;
}
else
{
AfxMessageBox( _T( "open Fail" ) );
}
}
DeleteKey 함수를 쓰면 아래와 같이 삭제가 됩니다.

RegCloseKey 버튼을 더블클릭 하여 아래와 같이 코딩합니다.
void CMFCApplication1Dlg::OnBnClickedButton4()
{
LSTATUS lstRes = ERROR_SUCCESS;
if ( NULL != m_hRegKey )
{
lstRes = ::RegCloseKey( m_hRegKey );
m_hRegKey = NULL;
}
}
REG_SZ로 데이터를 관리해보겠습니다.
RegSetValueEx 버튼을 더블클릭 하여 아래와 같이 코딩합니다.
void CMFCApplication1Dlg::OnBnClickedButton5()
{
LSTATUS lstRes = ERROR_SUCCESS;
CString sValName = _T( "VALUENAME" );
CString sVal = _T( "Test" );
TCHAR atcvalue[MAX_PATH];
ZeroMemory( atcvalue, sizeof( atcvalue ) );
_tcscpy_s( atcvalue, sVal.GetLength() + 1, sVal.GetBuffer() );
lstRes = ::RegSetValueExW( m_hRegKey,sValName, 0, REG_SZ, (LPBYTE)atcvalue, sValName.GetLength() + 1 );
}
위 함수를 실행하면 아래와 같이 REG_SZ타입의 Test라고 입력된 데이터가 생깁니다.

RegQueryValueEx 버튼을 더블클릭 하여 아래와 같이 코딩합니다.
void CMFCApplication1Dlg::OnBnClickedButton6()
{
LSTATUS lstRes = ERROR_SUCCESS;
CString sValName = _T( "VALUENAME" );
CString sVal = _T( "" );
DWORD dwBufSiz = 0;
TCHAR atcvalue[MAX_PATH];
ZeroMemory( atcvalue, sizeof( atcvalue ) );
lstRes = ::RegQueryValueEx( m_hRegKey, sValName, NULL, NULL, NULL, &dwBufSiz );
if ( ERROR_SUCCESS == lstRes )
{
TCHAR atcvalue[MAX_PATH];
ZeroMemory( atcvalue, sizeof( atcvalue ) );
lstRes = ::RegQueryValueEx( m_hRegKey, sValName, NULL, NULL, (LPBYTE)atcvalue, &dwBufSiz );
if ( ERROR_SUCCESS == lstRes )
{
sVal.Format( _T( "%s" ), atcvalue );
AfxMessageBox( sVal );
}
else
{
AfxMessageBox( sVal );
}
}
}
위 함수를 실행하면 아래와 같이 레지스트리 데이터를 읽어옵니다.

RegDeleteValue 버튼을 더블클릭 하여 아래와 같이 코딩합니다.
void CMFCApplication1Dlg::OnBnClickedButton7()
{
LSTATUS lstRes;
CString sValName = _T( "VALUENAME" );
if ( NULL != m_hRegKey )
{
lstRes = ::RegDeleteValue( m_hRegKey, sValName );
}
}
위 함수를 실행하면 데이터가 삭제 됩니다.
HKEY_CURRENT_USER 사용 해도 되지만 이 KEY의 경우엔 로그인한 윈도우마다 저장되는 경로가 다르기 때문에 특별한 조건이 없다면 HKEY_LOCAL_MACHINE을 추천합니다.
REG_SZ 해보시고 REG_DWORD, REG_BINARY 타입도 찾아서 해보시는걸 추천드립니다.