본문 바로가기

C/Reference

[C] 특정 경로의 하위 레지스트리를 모두 출력

반응형
HKEY hKey = NULL;
DWORD dwIndex = 0;
DWORD dwSize = 0;
DWORD cbName = MAX_PATH;
DWORD dwType = REG_SZ;
LSTATUS lStatus;
TCHAR szKeyName[MAX_PATH] = {0};
TCHAR szKeyInfo[MAX_PATH] = {0};
CString strSubKey = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall");
CString ErrorMsg;
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, strSubKey, 0, KEY_ALL_ACCESS, &hKey) != ERROR_SUCCESS)
{
	ErrorMsg.Format(_T("OpenKey Faild! : [ %s ]"), strSubKey);
	AfxMessageBox(ErrorMsg);
	ErrorMsg.Empty();
}
else
{
	while ((lStatus = RegEnumKeyEx(hKey,
	dwIndex,
	szKeyName,
	&cbName,
	NULL,
	NULL,
	NULL,
	NULL)) != ERROR_NO_MORE_ITEMS)
	{
		if (lStatus == ERROR_SUCCESS)
		{
			HKEY hItem = NULL;
			if (RegOpenKeyEx(hKey, szKeyName, 0, KEY_READ, &hItem) != ERROR_SUCCESS)
			{
				ErrorMsg.Format(_T("Can't open subkey : [ %s ]"), szKeyName);
				AfxMessageBox(ErrorMsg);
				ErrorMsg.Empty();
				continue;
			}
			else
			{
				//_tprintf(_T("%s\n"), szKeyName); // 얻어진 하위 키 이름들을 나열.
				// 추가적으로 얻어진 키에대한 default정보 기본값을 얻는 방법이다.
				ZeroMemory(szKeyInfo, MAX_PATH);
				dwSize = sizeof(szKeyInfo);
				// 만약 RegQueryValueEx()로 특정 문자열값 혹은 바이너리 값을 얻으려면 두 번째 인자에 얻고자 하는 데이터의 이름을 넣어주면된다.
				lStatus = RegQueryValueEx(hItem, _T("DisplayName"), NULL, &dwType, (LPBYTE)szKeyInfo, &dwSize);
				if (lStatus == ERROR_SUCCESS)
				{
					//_tcslwr_s(szKeyInfo);
					_tprintf(_T("  %s\n"), szKeyInfo);
				}
			}
			RegCloseKey(hItem);
		}
		dwIndex++;
		cbName = MAX_PATH;
	}
	RegCloseKey(hKey);
}
반응형