注册表的小应用

#include "stdafx.h"
#include <stdio.h>
#include <windows.h>

// 格式化错误码,输出对应错误字符串
void PrintErrorMsg(DWORD dwErrorCode)
{
	char szError[MAX_PATH];
	FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, 
		dwErrorCode, 0, szError, MAX_PATH, NULL);
	printf("%s\n", szError);
}

// 可以设置函数,递归调用,实现遍历主键下面的所有信息
int main(int argc, char* argv[])
{
	HKEY hKey;
	long lReturn = -1;
	
	// 打开主键
	lReturn = RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
		"SOFTWARE\\Microsoft\\Windows\\CurrentVersion", 
		0, KEY_QUERY_VALUE | KEY_READ, &hKey);
	if(ERROR_SUCCESS != lReturn)
	{
		PrintErrorMsg(lReturn);
		return -1;
	}
	
	DWORD dwIndex = 0;
	DWORD dwKeySize = MAX_PATH;
	char szKeyName[MAX_PATH];
	ZeroMemory(szKeyName, MAX_PATH);
	FILETIME ftm;
	
	// 遍历主键下面的所有子键
	lReturn = RegEnumKeyEx(hKey, dwIndex, szKeyName, 
		&dwKeySize, NULL, NULL, NULL, &ftm);
	while (ERROR_MORE_DATA == lReturn || ERROR_SUCCESS == lReturn)
	{
		printf("%s, size = %d\n", szKeyName, dwKeySize);
		dwIndex++;
		dwKeySize = MAX_PATH;
		ZeroMemory(szKeyName, MAX_PATH);
		lReturn = RegEnumKeyEx(hKey, dwIndex, szKeyName, 
			&dwKeySize, NULL, NULL, NULL, &ftm);
	}
	
	dwIndex = 0;
	DWORD dwValueType = 0;
	DWORD dwDataSize = MAX_PATH;
	DWORD dwValueNameSize = MAX_PATH;
	BYTE szDataName[MAX_PATH];
	char szValueName[MAX_PATH];
	ZeroMemory(szDataName, MAX_PATH);
	ZeroMemory(szValueName, MAX_PATH);
	
	// 遍历主键本身包含的键值
	lReturn = RegEnumValue(hKey, dwIndex, szValueName, &dwValueNameSize, 0, 
		&dwValueType, szDataName, &dwDataSize);
	if(ERROR_SUCCESS != lReturn)
	{
		PrintErrorMsg(lReturn);
	}
	
	while ( ERROR_SUCCESS == lReturn)
	{
		printf("KeyName\t= %s\nValue\t= %s\n", szValueName, szDataName);
		dwIndex++;
		dwValueNameSize = MAX_PATH;
		dwDataSize = MAX_PATH;
		ZeroMemory(szDataName, MAX_PATH);
		ZeroMemory(szValueName, MAX_PATH);
		
		lReturn = RegEnumValue(hKey, dwIndex, szValueName, &dwValueNameSize, 0, 
			&dwValueType, szDataName, &dwDataSize);
	}
	
	RegCloseKey(hKey);
	
	return 0;
}

你可能感兴趣的:(c)