65.9K
CodeProject 正在变化。 阅读更多。
Home

CRegSettings - 注册表帮助类

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.97/5 (15投票s)

2002年9月20日

3分钟阅读

viewsIcon

100498

downloadIcon

2521

用于将应用程序设置存储在注册表中的简单类。

引言

使用 Win32 API 甚至 CRegKey 辅助类来保存/加载配置值到/从注册表中是一件非常繁琐的事情。这个类使用类似 DDX 的方法将类成员变量映射到注册表数据。它非常易于使用,并且对于大多数典型的注册表用法来说已经足够智能。

如何使用

  1. rsettings.h 包含到你的项目中
  2. 声明一个包含配置值的类,并使用 BEGIN_REG_MAPEND_REG_MAP 定义映射
    // Sample application configuration
    class CMySettings : public CRegSettings
    {
    public:
        DWORD Value1; // DWORD option
        CString Value2; // String option
        DWORD RequiredValue;
    
        BEGIN_REG_MAP(CMySettings)
            REG_ITEM(Value1, 1)
            REG_ITEM(Value2, "Default Value")
            REG_ITEM_REQUIRE(RequiredValue)
        END_REG_MAP()
    };
    
  3. 就是这样!现在你可以保存或加载值了

        CMySettings settings(HKEY_CURRENT_USER, 
                "Software\\My Company\\Application\\1.0");
        settings.Load(); // Load configuration
    
        ... // use values settings.Value1 etc.
            
        settings.Save(); // Save configuration
    

CRegSettings 构造函数可以接受可变数量的参数

  CMySettings settings(HKEY_CURRENT_USER, "Software\\%s\\%s\\%i", 
     "My Company", "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<T>* 子键
std::string REG_SZ
std::vector<T>* 子键
std::list<T>* 子键
T* 子键

* - T 必须继承自 CRegSettings 并包含使用 BEGIN_REG_MAP - END_REG_MAP 声明的映射

宏参考

BEGIN_REG_MAP(class Name) - 标记注册表映射的开始。

END_REG_MAP() - 标记注册表映射的结束。

REG_ITEM(VarName, DefaultValue) - 将变量映射到注册表值。注册表值将被命名为“VarName”。如果在加载时注册表中不存在该值,则变量将被赋值为 DefaultValue。变量可以是以下类型之一:DWORDintlongboolcharwchar_tCString

REG_ITEM_REQUIRE(VarName) - 与 REG_ITEM 相同,但不能指定默认值。如果注册表中不存在该值,则 Load() 调用将失败。

REG_ITEM_SUBKEY(VarName) - 将继承自 CRegSettings 的类映射到子键。该类必须包含使用 BEGIN_REG_MAP - END_REG_MAP 声明的映射。请参阅示例应用程序。

REG_ITEM_SIMPLE_ARRAY(VarName) - 将 ATL 模板类 CSimpleArray<T> 映射到注册表。T 必须继承自 CRegSettings 并必须包含使用 BEGIN_REG_MAP - END_REG_MAP 声明的映射。数组项将保存在注册表的子键下。请参阅示例应用程序。

REG_ITEM_VECTOR(VarName) - 与 REG_ITEM_SIMPLE_ARRAY 相同,但用于 std::vector 类型。

REG_ITEM_LIST(VarName) - 与 REG_ITEM_SIMPLE_ARRAY 相同,但用于 std::list 类型。

REG_ITEM_SZ(VarName, DEFAULT_VALUE) - 将 C 字符串 (TCHAR*) 映射到注册表值 (REG_SZ)。注册表值将被命名为“VarName”。如果在加载时注册表中不存在该值,则变量将被赋值为 DefaultValue。

REG_ITEM_SZ_REQUIRE(VarName) - 与 REG_ITEM_SZ 相同,但不能指定默认值。如果注册表中不存在该值,则 Load() 调用将失败。

REG_ITEM_SZ_LEN(VarName, DEFAULT_VALUE, VarLen) - 与 REG_ITEM_SZ 相同,但增加了 VarLen 参数,用于指定 TCHAR 的缓冲区大小。

REG_ITEM_SZ_REQUIRE_LEN(VarName, VarLen) - 与 REG_ITEM_SZ_REQUIRE 相同,但增加了 VarLen 参数,用于指定 TCHAR 的缓冲区大小。

REG_ITEM_BINARY(VarName) - 将任何类型映射到注册表值 (REG_BINARY)。注册表值将被命名为“VarName”。对于结构体、数组等非常有用。二进制数据的大小通过 sizeof(VarName) 计算。

REG_ITEM_BINARY_SIZE(VarName, VarSize) - 与 REG_ITEM_BINARY 相同,但增加了 VarSize 参数,用于指定变量大小。

REG_ITEM_STL(VarName, DefaultValue) and REG_ITEM_STL_REQUIRE(VarName) - REG_ITEMREG_ITEM_REQUIRE 相同。将 std::string 映射到 REG_SZ

历史

  • 7.10.2002
    • OnBeforeSave, OnAfterLoad 虚方法;
    • 修复了 Bug。
  • 25.09.2002
    • REG_ITEM_SUBKEY:将数据存储在子键中 
    • REG_ITEM_BINARY,REG_ITEM_BINARY_SIZE:存储二进制数据(void*、结构体等) 
    • REG_ITEM_SZ, REG_ITEM_SZ_REQUIRE, REG_ITEM_SZ_LEN,
    • REG_ITEM_SZ_REQUIRE_LEN:存储 C 字符串 (TCHAR*)
    • REG_ITEMREG_ITEM_REQUIRED 增强以支持:boolintcharwchar_t
  • 19.09.2002
    • Created
© . All rights reserved.