在Windows应用程序开发中,经常需要将应用程序的配置信息保存到注册表中。本文将介绍如何使用CRegKey类和CRegSettings类来实现这一功能。CRegKey是一个辅助类,用于简化注册表的读写操作。而CRegSettings类则提供了一种类似于DDX映射的机制,将类成员变量映射到注册表数据。
首先,需要将rsettings.h头文件包含到项目中。然后,声明一个类来包含配置值,并定义一个映射,使用BEGIN_REG_MAP和END_REG_MAP宏来标记映射的开始和结束。
class CMySettings : public CRegSettings {
public:
DWORD Value1; // DWORD类型选项
CString Value2; // 字符串类型选项
DWORD RequiredValue; // 必需的DWORD类型值
BEGIN_REG_MAP(CMySettings)
REG_ITEM(Value1, 1)
REG_ITEM(Value2, L"Default Value")
REG_ITEM_REQUIRE(RequiredValue)
END_REG_MAP()
};
现在,可以保存或加载值:
CMySettings settings(HKEY_CURRENT_USER, L"Software\\My Company\\Application\\1.0");
settings.Load(); // 加载配置
// 使用值 settings.Value1 等
settings.Save(); // 保存配置
CRegSettings构造函数可以带有不同的参数数量:
CMySettings settings(HKEY_CURRENT_USER, L"Software\\%s\\%s\\%i", L"My Company", L"My Application", Version);
变量映射到注册表中对应的键和值:
变量类型 | 注册表数据类型 |
---|---|
DWORD | REG_DWORD |
int | REG_DWORD |
long | REG_DWORD |
bool | REG_DWORD |
char | REG_DWORD |
wchar_t | REG_DWORD |
TCHAR* | REG_SZ |
void* (结构体、数组等) | REG_BINARY |
CString | REG_SZ |
CSimpleArray |
子键 |
std::string | REG_SZ |
std::vector |
子键 |
std::list |
子键 |
以下是一些常用的宏定义:
BEGIN_REG_MAP(ClassName) // 标记注册表映射的开始
END_REG_MAP() // 标记注册表映射的结束
REG_ITEM(VarName, DefaultValue) // 将变量映射到注册表值
REG_ITEM_REQUIRE(VarName) // 同上,但不允许指定默认值
REG_ITEM_SUBKEY(VarName) // 将CRegSettings继承的类映射到子键
REG_ITEM_SIMPLE_ARRAY(VarName) // 将CSimpleArray映射到注册表
REG_ITEM_VECTOR(VarName) // 同上,但适用于std::vector类型
REG_ITEM_LIST(VarName) // 同上,但适用于std::list类型
REG_ITEM_SZ(VarName, DEFAULT_VALUE) // 将C字符串映射到注册表值
REG_ITEM_SZ_REQUIRE(VarName) // 同上,但不允许指定默认值
REG_ITEM_SZ_LEN(VarName, DEFAULT_VALUE, VarLen) // 同上,但带缓冲区大小参数
REG_ITEM_BINARY(VarName) // 将任何类型映射到注册表值(REG_BINARY)
REG_ITEM_BINARY_SIZE(VarName, VarSize) // 同上,但带变量大小参数
REG_ITEM_STL(VarName, DefaultValue) // 将std::string映射到REG_SZ
REG_ITEM_STL_REQUIRE(VarName) // 同上,但不允许指定默认值