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); } } } }