[WinAPI] MFC를 이용한 Registry 코딩

안녕하세요 저번 글에서 프로그램에서 설정을 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 타입도 찾아서 해보시는걸 추천드립니다.