유용한 정보

[MFC] 윈도우 레지스트리의 키 또는 데이터를 읽고 쓰고 삭제하기

DevReff 2025. 4. 19. 14:00
728x90
728x90
SMALL

1. 레지스트리의 키 생성하기 ( RegCreateKeyEx )

    RegCreateKeyEx 는 레지스트리에 이미 존재하면 키를 읽어오고 

    그렇지않으면 새롭게 키를 생성한다.

    예를들어 HKEY_CURRENT_USER\SOFTWARE\Hi 키가

    레지스트리에 없으면 새롭게 만들고 있으면 그 키를 가져온다.

    그리고  OS가 64비트이고 레지스트리에 데이터를 쓰려고 할 때 오류가 발생하면

    samDesired 옵션에 KEY_WOW64_64KEY를 추가한다.

 

함수 프로토타입)
WINADVAPI
LSTATUS
APIENTRY
RegCreateKeyEx(
    _In_ HKEY hKey,
    _In_ LPCWSTR lpSubKey,
    _Reserved_ DWORD Reserved,
    _In_opt_ LPWSTR lpClass,
    _In_ DWORD dwOptions,
    _In_ REGSAM samDesired,
    _In_opt_ CONST LPSECURITY_ATTRIBUTES lpSecurityAttributes,
    _Out_ PHKEY phkResult,
    _Out_opt_ LPDWORD lpdwDisposition
    );

 

예제)

if (RegCreateKeyEx(hKeyRoot,
    _T("SOFTWARE\\Hi"), 0,
    NULL, REG_OPTION_NON_VOLATILE,
    KEY_WRITE | KEY_WOW64_64KEY , NULL,
    &hKey, &dwDisposition) == ERROR_SUCCESS)

 

2. 레지스트리 키 불러오기 ( RegOpenKeyEx )

 

if (RegOpenKeyEx(hKeyRoot, // 키
sRegPath,  // 경로
0,
KEY_WRITE,// | KEY_WOW64_64KEY, 
&hKey) == ERROR_SUCCESS)
{
if (RegDeleteValue(hKey, _T("Value2")) == ERROR_SUCCESS)
{
OutputDebugString(_T("레지스트리 데이터(Value2) 삭제 성공!!!\n"));
m_lstMsg.InsertString(0, _T("레지스트리 데이터(Value2) 삭제 성공!!!"));
}
else
{
OutputDebugString(_T("레지스트리 데이터(Value2) 삭제 실패!!!\n"));
m_lstMsg.InsertString(0, _T("레지스트리 데이터(Value2) 삭제 실패!!!"));
}
}
else
{
OutputDebugString(_T("레지스트리 키 값 불러오기 실패!!!\n"));
m_lstMsg.InsertString(0, _T("레지스트리 키 값 불러오기 실패!!!"));
}

 

3. 레지스트리에 데이터 쓰기 ( RegSetValueEx )

        RegSetValueEx 함수는 읽어온 키에 데이터를 저장한다.

 

HKEY hKey = NULL;
DWORD dwDisposition;
CString sMsg;
CString sValue;
CString sResult;

if (RegCreateKeyEx(HKEY_CURRENT_USER, // 키
    _T("SOFTWARE\\Hi"),  // 경로
    0, NULL,
    REG_OPTION_NON_VOLATILE, // 비휘발성, 재부팅해도 값 보존
    KEY_WRITE, NULL,
    &hKey, &dwDisposition) == ERROR_SUCCESS)
{
    // 성공
    OutputDebugString(_T("레지스트리 키 읽기 성공\n"));

    // CString 값 저장
    sValue = _T("Value1");
    CString sData = _T("data");
    if (RegSetValueEx(hKey, sValue, 0, REG_SZ,
       (CONST BYTE*)(LPCTSTR)sData, (DWORD)(_tcslen(sData) + 1) * sizeof(TCHAR)) == ERROR_SUCCESS)
   {
         // 성공
        sMsg.Format(_T("CString 값 저장: %s = %s\n"), sValue, sData);
        OutputDebugString(sMsg);
   }

// DWORD 값 저장
sValue = _T("Value2");
DWORD dData = 5;
if (RegSetValueEx(hKey, sValue, 0, REG_DWORD,
(CONST BYTE*) & dData, sizeof(dData)) == ERROR_SUCCESS)
{
    // 성공
    sMsg.Format(_T("DWORD 값 저장: %s = %d\n"), sValue, dData);
    OutputDebugString(sMsg);
    }
}
else
{
    OutputDebugString(_T("레지스트리 키 값 불러오기 실패!!!\n"));
}

RegCloseKey(hKey);

반응형
728x90

4. 레지스트리에서 데이터 불러오기 ( RegQueryValueEx 또는 RegGetValue )

if (RegCreateKeyEx(HKEY_CURRENT_USER,
    _T("SOFTWARE\\Hi"), 0,
    NULL, REG_OPTION_NON_VOLATILE,
    KEY_READ, NULL,
    &hKey, &dwDisposition) == ERROR_SUCCESS)
{
    // CString 값 불러오기

1) 불러올 문자열의 길이를 알아낸다.
DWORD dwDataSize = 0;
TCHAR* pPath = NULL;
sValue = _T("Value1");
if (RegQueryValueEx(hKey, sValue,
    NULL, NULL, NULL, &dwDataSize) == ERROR_SUCCESS)
{

2) 알아낸 문자열의 길이만큼 불러들인다.
if (dwDataSize)
{
    pPath = new TCHAR[dwDataSize];
    if (RegQueryValueEx(hKey, sValue,
            NULL, NULL, (LPBYTE)pPath, &dwDataSize) == ERROR_SUCCESS)
    {
           // 성공
           sResult = pPath;
           delete pPath;
            sMsg.Format(_T("CString 값 불러오기: %s = %s\n"), sValue, sResult);
            OutputDebugString(sMsg);
    }
}

// DWORD 값 불러오기
sValue = _T("Value2");
DWORD dResult;
dwDataSize = sizeof(dResult);


if (RegQueryValueEx(hKey, sValue, NULL,  NULL, (LPBYTE)&dResult, &dwDataSize) == ERROR_SUCCESS)
{     

    //성공    

    sMsg.Format(_T("DWORD 값 불러오기: %s = %d\n"), sValue, dResult);    

    OutputDebugString(sMsg);
}
else
{
    OutputDebugString(_T("DWORD 값 불러오기 실패!!!\n"));
}


RegCloseKey(hKey);

 

* 주의 : 문자열을 불러올 때에는 먼저 불러올 문자열의 길이가 얼마인지 체크하고 

             알아낸 문자열의 길이만큼 불러와야한다.

 

5. 레지스트리 키/데이터 삭제하기 ( RegDeleteKey / RegDeleteValue )

레지스트리의 루트가 HKEY_LOCAL_MACHINE 이면

키 또는 데이터를 삭제하기 위해서는 관리자권한으로  실행 해야한다.

1) 키 삭제하기 ( RegDeleteKey )

if (RegDeleteKey(hKeyRoot, _T("SOFTWARE\\Hi")) == ERROR_SUCCESS)
{
    OutputDebugString(_T("레지스트리 키 삭제 성공!!!\n"));
}
else
{
    OutputDebugString(_T("레지스트리 키 삭제 실패!!!\n"));
}

 

2) 데이터 삭제하기 ( RegDeleteValue )

if (RegOpenKeyEx(hKeyRoot, // 키
    _T("SOFTWARE\\Hi"),  // 경로
    0, 
    KEY_WRITE,
    &hKey) == ERROR_SUCCESS)
{
if (RegDeleteValue(hKey, _T("Value2")) == ERROR_SUCCESS)
{
    OutputDebugString(_T("레지스트리 데이터 삭제 성공!!!\n"));
}
else
{
    OutputDebugString(_T("레지스트리 데이터 삭제 실패!!!\n"));
}
}
else
{
    OutputDebugString(_T("레지스트리 키 값 불러오기 실패!!!\n"));
}

 

 

※ 주의)

경우1) 루트키가 HKEY_CURRENT_USER일 경우

    데이터를 읽거나 쓸 때에 특별한 경우가  아니면 오류가 발생하지 않는다.

    관리자권한으로  실행하지않아도 특별한 경우가 아니면 오류가 발생하지 않는다.

 

경우2) 루트키가  HKEY_LOCAL_MACHINE일 경우

    관리자권한으로  실행 해야한다.

    samDesired 옵션에 KEY_WOW64_64KEY를 추가하지 않으면 오류가 많이 발생한다.

 

728x90
728x90
LIST