Windows核心编程——MFC下注册表操作和管理

Posted zhaoyixiang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Windows核心编程——MFC下注册表操作和管理相关的知识,希望对你有一定的参考价值。

1.注册表

  注册表(Registry),是Microsoft Windows中的一个重要的数据库,用于存储系统应用程序的设置信息。

2.注册表操作

    系统的配置一般都保存在注册表里,一些软件配置信息也在注册表
    Win+R  regedit 可以打开windows的注册表编辑工具
    
    如何操作注册表?
  相关api:

技术图片

 

 

 

3.MFC操作注册表

 

1)添加键值对:

添加键:RegCreateKey()

示例:指定目录下添加键shadow

	RegCreateKey
	
	HKEY hSubKey;
	LONG lRet = RegCreateKey(
		HKEY_CURRENT_USER,//主键
		"Software\\shadow",
		&hSubKey //传出参数
	);

	if (lRet != ERROR_SUCCESS)
	{
		return 0;
     }

成功添加键:

 技术图片

 

 

 

设置值:  RegSetKeyValue()

 示例:设置值test

char szValue[] = { "hello" };
	lRet = RegSetKeyValue(
		HKEY_CURRENT_USER, //主键
		"Software\\shadow", //子键的路径
		"test", //值的名称
		REG_SZ, //值的类型
		szValue, //值的数据所在的缓冲区
		sizeof(szValue)
	);

	if (lRet != ERROR_SUCCESS)
	{
		return 0;
        }    

 

成功添加test:


技术图片

2)删除数据:


 RegDeleteKeyValue() //删除键值对
 RegDeleteKey()  //删除键

示例:删除test:

lRet = RegDeleteKeyValue(
	HKEY_CURRENT_USER, //主键
	"Software\\shadow", //子键的路径
	"test" //值的名称
    );

 test删除成功:

 技术图片

3)查询数据:

RegEnumValue()   //枚举键值信息
RegQueryValueEx() //查询键上有多少个值
RegQueryInfoKey()  //查询键

 

    软件配置信息放在注册表,在卸载软件后再安装信息还存在。如
果在自己目录下,卸载后所有信息都会消失。

查询示例:

HKEY hWinRar = NULL;
lRet = RegOpenKey(HKEY_CURRENT_USER, "Software\\RegisteredApplications", &hWinRar);
QueryKey(hWinRar);


#define MAX_KEY_LENGTH 255
#define MAX_VALUE_NAME 16383

void QueryKey(HKEY hKey)
{
	TCHAR    achKey[MAX_KEY_LENGTH];   // buffer for subkey name
	DWORD    cbName;                   // size of name string 
	TCHAR    achClass[MAX_PATH] = TEXT("");  // buffer for class name 
	DWORD    cchClassName = MAX_PATH;  // size of class string 
	DWORD    cSubKeys = 0;               // number of subkeys 
	DWORD    cbMaxSubKey;              // longest subkey size 
	DWORD    cchMaxClass;              // longest class string 
	DWORD    cValues;              // number of values for key 
	DWORD    cchMaxValue;          // longest value name 
	DWORD    cbMaxValueData;       // longest value data 
	DWORD    cbSecurityDescriptor; // size of security descriptor 
	FILETIME ftLastWriteTime;      // last write time 

	DWORD i, retCode;

	TCHAR  achValue[MAX_VALUE_NAME];
	DWORD cchValue = MAX_VALUE_NAME;

	// Get the class name and the value count. 
	retCode = RegQueryInfoKey(
		hKey,                    // key handle 
		achClass,                // buffer for class name 
		&cchClassName,           // size of class string 
		NULL,                    // reserved 
		&cSubKeys,               // 子键的个数
		&cbMaxSubKey,            // longest subkey size 
		&cchMaxClass,            // longest class string 
		&cValues,                // 键所对应的值的个数
		&cchMaxValue,            // longest value name 
		&cbMaxValueData,         // longest value data 
		&cbSecurityDescriptor,   // security descriptor 
		&ftLastWriteTime);       // last write time 

								 // Enumerate the subkeys, until RegEnumKeyEx fails.

	//遍历键的信息
	if (cSubKeys)
	{
		printf("
Number of subkeys: %d
", cSubKeys);

		for (i = 0; i < cSubKeys; i++)
		{
			cbName = MAX_KEY_LENGTH;
			retCode = RegEnumKeyEx(hKey, i,
				achKey,
				&cbName,
				NULL,
				NULL,
				NULL,
				&ftLastWriteTime);
			if (retCode == ERROR_SUCCESS)
			{
				_tprintf(TEXT("(%d) %s
"), i + 1, achKey);
			}
		}
	}

	// 遍历值的信息
	if (cValues)
	{
		printf("
Number of values: %d
", cValues);

		for (i = 0, retCode = ERROR_SUCCESS; i < cValues; i++)
		{
			cchValue = MAX_VALUE_NAME;
			achValue[0] = ‘‘;
			retCode = RegEnumValue(hKey, i,
				achValue,
				&cchValue,
				NULL,
				NULL,
				NULL,
				NULL);

			if (retCode == ERROR_SUCCESS)
			{
				_tprintf(TEXT("(%d) %s
"), i + 1, achValue);
			}
		}
	}
}

 

以上是关于Windows核心编程——MFC下注册表操作和管理的主要内容,如果未能解决你的问题,请参考以下文章

Windows核心编程——MFC下INI文件操作

Windows核心编程——MFC下INI文件操作

Windows数据库编程接口简介

个人的后门程序开发(第一部分):文件操作和注册表管理

Windows下socket编程(console非MFC)

Shell编程之一