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("\nNumber of subkeys: %d\n", 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\n"), i + 1, achKey);
}
}
}
// 遍历值的信息
if (cValues)
{
printf("\nNumber of values: %d\n", cValues);
for (i = 0, retCode = ERROR_SUCCESS; i < cValues; i++)
{
cchValue = MAX_VALUE_NAME;
achValue[0] = '\0';
retCode = RegEnumValue(hKey, i,
achValue,
&cchValue,
NULL,
NULL,
NULL,
NULL);
if (retCode == ERROR_SUCCESS)
{
_tprintf(TEXT("(%d) %s\n"), i + 1, achValue);
}
}
}
}

浙公网安备 33010602011771号