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);
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를 추가하지 않으면 오류가 많이 발생한다.
'유용한 정보' 카테고리의 다른 글
[C#] MonthCalendar 요일 클릭하기 (0) | 2025.04.24 |
---|---|
Windows 10에서 Visual Studio 6(vc6.0) 설치 방법 (2) | 2025.04.22 |
[C#] 기간 선택하기 (0) | 2025.04.19 |
[C#] 관리자 권한으로 실행하게 만들기 (0) | 2025.04.18 |
[C#] 레지스트리 읽기/쓰기 (0) | 2025.04.17 |