注册表类






4.55/5 (9投票s)
2001年3月28日
21分钟阅读

85184

1416
这表示我构建了一组方便的类,以减轻处理注册表的痛苦。
引言
这表示我构建了一组方便的类,以减轻处理注册表的痛苦。除了RegVars.h中定义的一组高级类之外,还有一个单独的库,由`RegVars`模块Registry.h使用。这包括所有四个文件的完整源代码的下载链接。本文档的其余部分描述了接口。
- 概述
- 注册表类
- 注册表库
- 类描述
- RegistryInt
- RegistryString
- 库描述
- [获取/设置]RegistryString
- [获取/设置]RegistryInt
- [获取/设置]RegistryInt64
- [获取/设置]RegistryGUID
- [获取/设置]RegistryFont
- [获取/设置]RegistryWindowPlacement
- [获取/设置]RegistryDWordArray
- DeleteRegistry[Key/Value]
- [获取/查找]RegistryKey
- EnumRegistry[Keys/Values]
概述
使用注册表可能很不方便。您必须学习所有的注册表API,学习如何创建键,然后发现您必须递归创建键。这真是太痛苦了。
我创建了这些类和库,以便轻松地执行注册表中的简单任务。它要求您在包含它的模块的字符串表中定义几个字符串,其中最重要的是
IDS_ROOT_PATH "Software\\YourCompanyName\\YourProductName"
通过此库对注册表的所有访问都将相对于此键。
注册表类 
对于大多数简单的情况,例如整数或字符串,您可以使用注册表类`RegistryInt`和`RegistryString`。
要使用这些,您只需声明一个带有所需访问键的字符串表条目,该键本身可能包含用于子路径的\字符,例如
IDS_MY_COUNTER "Count"
然后声明一个形式为
RegistryInt count(IDS_MY_COUNTER);
的变量,然后加载它,您将编写
count.load(defaultvalue); // argument optional, 0 assumed
然后,您可以通过使用以下方式访问类型为`int`的值:
count.value
如果您想将值存储在注册表中,请将`count.value`设置为您要存储的值,然后执行
count.store();
该值将存储在注册表中。如果路径的步骤不存在,它们将被创建。
相应的字符串类型是`RegistryString`,并且`.value`成员是`CString`。
RegistryString s(IDS_MY_STRING);
s.load();; // defaults to ""
将从注册表加载一个字符串值。
注册表库 
注册表库是注册表类的基础,它提供了更详细的控制。我没有为某些接口提供类,因为它们使用频率不高,所以我没有费心为它们创建类。
注册表库允许设置和检索字符串值、整数值、64位整数值、GUID、字体描述、窗口位置描述和DWORD值数组,以及删除键和值、枚举键和值的能力,以及简单地获取键的句柄以进行更详细的注册表API操作。
像注册表类一样,这些操作始终相对于`IDS_PROGRAM_ROOT`工作,并在设置操作时自动创建路径的步骤。
RegVars.h
尽管要使用它您只需包含此头文件,但您必须*链接*注册表库,这些类使用的方法会调用该库来执行实际的注册表操作。如果您在任何项目文件中包含此文件,则必须包含RegVars.cpp在您的项目中或链接已编译版本RegVars.obj.
RegistryInt 
RegistryInt::RegistryInt(UINT id, HKEY r = HKEY_CURRENT_USER)
构造`RegistryInt`类型的变量。
参数
|
存储或检索值的注册表键的字符串表ID。 |
|
指定键的根键。它将在键下找到
|
RegistryInt::load(int def = 0);
从注册表加载值。提供默认值。当此方法返回时,变量的`.value`成员将具有注册表中的值或默认值。
|
如果在注册表中找不到键,则使用的值。 |
RegistryInt::store();
将值存储到变量指定的键下的注册表中。将存储`.value`成员的当前内容。
int value;
这是类的`.value`成员。
RegistryString 
RegistryString::RegistryString(UINT id, HKEY r = HKEY_CURRENT_USER)
构造`RegistryString`类型的变量。
参数
|
存储或检索值的注册表键的字符串表ID。 |
|
指定键的根键。它将在键下找到
|
RegistryString::load(LPCTSTR def = NULL);
从注册表加载值。提供默认值。当此方法返回时,变量的`.value`成员(一个`CString`)将具有注册表中的值或默认值。如果字符串参数值是`NULL`,则`.value`成员被设置为空字符串。
|
如果在注册表中找不到键,则使用的值。 |
RegistryString::store();
将值存储到变量指定的键下的注册表中。将存储`.value`成员的当前内容。
CString value;
这是类的`.value`成员。
Registry.h 
该Registry.cpp模块提供对注册表的更直接访问。所有操作都相对于字符串表条目`IDS_PROGRAM_ROOT`指定的字符串执行。
当您需要更精细的控制时,例如在创建动态计算的非常量注册表键时,可以使用这些函数。
为了简化表示法,我采用了环境变量扩展的表示法。在这种情况下,我使用`%name%`来表示字符串表中由值name标识的字符串的扩展。因此,`%IDS_PROGRAM_ROOT%`应该在下面的描述中替换为`IDS_PROGRAM_ROOT`所表示的字符串,如果name在程序中定义了一个变量或参数,则替换为由该变量或参数表示的整数检索到的字符串。
在所有情况下,如果函数返回`FALSE`,则可以通过调用`::GetLastError()`找到错误。除了注册表API调用可能返回的标准错误之外,如果值对于操作类型错误或长度错误,`::GetLastErro()`将返回`ERROR_INVALID_DATA`。
如果您使用此头文件,或者如果您使用RegVars.cpp模块,您必须将其包含在您的编译中或链接已编译的RegVars.obj文件。
[获取/设置]RegistryString 
BOOL GetRegistryString(HKEY root, const CString & var,
CString & val);
|
找到键的根,通常是`HKEY_CURRENT_USER`或`HKEY_LOCAL_MACHINE`。键将被评估为
|
|
定义变量的变量路径。如果路径不存在,则调用返回`FALSE`。请注意,此字符串可以包含描述更复杂路径的\字符。 |
|
如果调用结果为`TRUE`,则注册表的内容(必须是`REG_SZ`类型)将在此变量中找到。如果结果为`FALSE`,则其保持不变。 |
BOOL SetRegistryString(HKEY root, const CString & var, const CString & val);
|
找到键的根,通常是`HKEY_CURRENT_USER`或`HKEY_LOCAL_MACHINE`。键将被评估为
|
|
定义变量的变量路径。如果路径不存在,它将被创建。如果在创建过程中发生任何错误,此调用将返回`FALSE`。请注意,此字符串可以包含描述更复杂路径的\字符。 |
|
如果调用结果为`TRUE`,则此参数的内容将存储为`REG_SZ`类型的值。 |
BOOL GetRegistryString(HKEY root, const CString & path,
UINT var, CString & val);
|
找到键的根,通常是`HKEY_CURRENT_USER`或`HKEY_LOCAL_MACHINE`。键将被评估为
|
|
从根目录和程序根目录到值的路径,其中`var`参数指定路径的其余部分。 |
|
定义变量的变量路径,由字符串表条目表示。如果路径不存在,则调用返回`FALSE`。请注意,此字符串可以包含描述更复杂路径的\字符。 |
|
如果调用结果为`TRUE`,则注册表的内容(必须是`REG_SZ`类型)将在此变量中找到。如果结果为`FALSE`,则其保持不变。 |
BOOL SetRegistryString(HKEY root, const CString & path, UINT var, const CString & val);
|
找到键的根,通常是`HKEY_CURRENT_USER`或`HKEY_LOCAL_MACHINE`。键将被评估为
|
|
从根目录和程序根目录到值的路径,其中`var`参数指定路径的其余部分。 |
|
定义变量的变量路径,包含在由整数`var`指定的字符串表条目中。如果路径不存在,它将被创建。如果在创建过程中发生任何错误,此调用将返回`FALSE`。请注意,此字符串可以包含描述更复杂路径的\字符。 |
|
如果调用结果为`TRUE`,则此参数的内容将存储为`REG_SZ`类型的值。 |
BOOL GetRegistryString(HKEY root, const CString & path, const CString & var, CString & val);
|
找到键的根,通常是`HKEY_CURRENT_USER`或`HKEY_LOCAL_MACHINE`。键将被评估为
|
|
从根目录和程序根目录到值的路径,其中`var`参数指定路径的其余部分。 |
|
定义变量的变量路径。如果路径不存在,则调用返回`FALSE`。请注意,此字符串可以包含描述更复杂路径的\字符。 |
|
如果调用结果为`TRUE`,则注册表的内容(必须是`REG_SZ`类型)将在此变量中找到。如果结果为`FALSE`,则其保持不变。 |
BOOL SetRegistryString(HKEY root, const CString & path, const CString & var, const CString & val);
|
找到键的根,通常是`HKEY_CURRENT_USER`或`HKEY_LOCAL_MACHINE`。键将被评估为
|
|
从根目录和程序根目录到值的路径,其中`var`参数指定路径的其余部分。 |
|
定义变量的变量路径。如果路径不存在,它将被创建。如果在创建过程中发生任何错误,此调用将返回`FALSE`。请注意,此字符串可以包含描述更复杂路径的\字符。 |
|
如果调用结果为`TRUE`,则此参数的内容将存储为`REG_SZ`类型的值。 |
[获取/设置]RegistryInt 
BOOL GetRegistryInt(HKEY root, const CString & var, DWORD & val);
|
找到键的根,通常是`HKEY_CURRENT_USER`或`HKEY_LOCAL_MACHINE`。键将被评估为
|
|
定义变量的变量路径。如果路径不存在,则调用返回`FALSE`。请注意,此字符串可以包含描述更复杂路径的\字符。 |
|
如果调用结果为`TRUE`,则注册表的内容(必须是`REG_DWORD`类型)将在此变量中找到。如果结果为`FALSE`,则其保持不变。 |
BOOL SetRegistryInt(HKEY root, const CString & var, DWORD val);
|
找到键的根,通常是`HKEY_CURRENT_USER`或`HKEY_LOCAL_MACHINE`。键将被评估为
|
|
定义变量的变量路径。如果路径不存在,它将被创建。如果在创建过程中发生任何错误,此调用将返回`FALSE`。请注意,此字符串可以包含描述更复杂路径的\字符。 |
|
如果调用结果为`TRUE`,则此参数的内容将存储为`REG_DWORD`类型的值。 |
BOOL GetRegistryInt(HKEY root, const CString & path,
UINT var, DWORD & val);
|
找到键的根,通常是`HKEY_CURRENT_USER`或`HKEY_LOCAL_MACHINE`。键将被评估为
|
|
从根目录和程序根目录到值的路径,其中`var`参数指定路径的其余部分。 |
|
定义变量的变量路径,由字符串表条目表示。如果路径不存在,则调用返回`FALSE`。请注意,此字符串可以包含描述更复杂路径的\字符。 |
|
如果调用结果为`TRUE`,则注册表的内容(必须是`REG_DWORD`类型)将在此变量中找到。如果结果为`FALSE`,则其保持不变。 |
BOOL SetRegistryInt(HKEY root, const CString & path,
UINT var, DWORD val);
|
找到键的根,通常是`HKEY_CURRENT_USER`或`HKEY_LOCAL_MACHINE`。键将被评估为
|
|
从根目录和程序根目录到值的路径,其中`var`参数指定路径的其余部分。 |
|
定义变量的变量路径,包含在由整数`var`指定的字符串表条目中。如果路径不存在,它将被创建。如果在创建过程中发生任何错误,此调用将返回`FALSE`。请注意,此字符串可以包含描述更复杂路径的\字符。 |
|
如果调用结果为`TRUE`,则此参数的内容将存储为`REG_DWORD`类型的值。 |
BOOL GetRegistryInt(HKEY root, const CString & path, const CString & var, DWORD & val);
|
找到键的根,通常是`HKEY_CURRENT_USER`或`HKEY_LOCAL_MACHINE`。键将被评估为
|
|
从根目录和程序根目录到值的路径,其中`var`参数指定路径的其余部分。 |
|
定义变量的变量路径。如果路径不存在,则调用返回`FALSE`。请注意,此字符串可以包含描述更复杂路径的\字符。 |
|
如果调用结果为`TRUE`,则注册表的内容(必须是`REG_DWORD`类型)将在此变量中找到。如果结果为`FALSE`,则其保持不变。 |
BOOL SetRegistryInt(HKEY root, const CString & path, const CString & var, DWORD val);
|
找到键的根,通常是`HKEY_CURRENT_USER`或`HKEY_LOCAL_MACHINE`。键将被评估为
|
|
从根目录和程序根目录到值的路径,其中`var`参数指定路径的其余部分。 |
|
定义变量的变量路径。如果路径不存在,它将被创建。如果在创建过程中发生任何错误,此调用将返回`FALSE`。请注意,此字符串可以包含描述更复杂路径的\字符。 |
|
如果调用结果为`TRUE`,则此参数的内容将存储为`REG_DWORD`类型的值。 |
[获取/设置]RegistryInt64 
BOOL GetRegistryInt64(HKEY root, const CString & var, ULONGLONG & val);
|
找到键的根,通常是`HKEY_CURRENT_USER`或`HKEY_LOCAL_MACHINE`。键将被评估为
|
|
定义变量的变量路径。如果路径不存在,则调用返回`FALSE`。请注意,此字符串可以包含描述更复杂路径的\字符。 |
|
如果调用结果为`TRUE`,则注册表的内容(必须是`REG_BINARY`类型的8字节值)将在此变量中找到。如果结果为`FALSE`,则其保持不变。 |
BOOL SetRegistryInt64(HKEY root, const CString & var, ULONGLONG val);
|
找到键的根,通常是`HKEY_CURRENT_USER`或`HKEY_LOCAL_MACHINE`。键将被评估为
|
const CString & var |
定义变量的变量路径。如果路径不存在,它将被创建。如果在创建过程中发生任何错误,此调用将返回`FALSE`。请注意,此字符串可以包含描述更复杂路径的\字符。 |
ULONGLONG val |
如果调用结果为`TRUE`,则此参数的内容将存储为`REG_BINARY`类型的8字节值。 |
[获取/设置]RegistryGUID 
BOOL GetRegistryGUID(HKEY root, const CString & var, GUID & val);
HKEY root |
找到键的根,通常是`HKEY_CURRENT_USER`或`HKEY_LOCAL_MACHINE`。键将被评估为
|
const CString & var |
定义变量的变量路径。如果路径不存在,则调用返回`FALSE`。请注意,此字符串可以包含描述更复杂路径的\字符。 |
ULONGLONG & val |
如果调用结果为`TRUE`,则注册表的内容(必须是`REG_BINARY`类型的16字节值)将在此变量中找到。如果结果为`FALSE`,则其保持不变。 |
BOOL SetRegistryGUID(HKEY root, const CString & var, const GUID & val);
|
找到键的根,通常是`HKEY_CURRENT_USER`或`HKEY_LOCAL_MACHINE`。键将被评估为
|
|
定义变量的变量路径。如果路径不存在,它将被创建。如果在创建过程中发生任何错误,此调用将返回`FALSE`。请注意,此字符串可以包含描述更复杂路径的\字符。 |
|
如果调用结果为`TRUE`,则此参数的内容将存储为`REG_BINARY`类型的8字节值。 |
[获取/设置]RegistryFont 
BOOL GetRegistryFont(HKEY root, const CString & var, LPLOGFONT val);
|
找到键的根,通常是`HKEY_CURRENT_USER`或`HKEY_LOCAL_MACHINE`。键将被评估为
|
|
定义变量的变量路径。如果路径不存在,则调用返回`FALSE`。请注意,此字符串可以包含描述更复杂路径的\字符。 |
|
此结构将首先完全清零。如果调用结果为`TRUE`,则字体的注册表信息的完整内容(由子键`var`下的值表示)将在此结构中找到。如果结果为`FALSE`,则字段将部分填充。 |
BOOL SetRegistryFont(HKEY root, const CString & var, const LOGFONT * val);
|
找到键的根,通常是`HKEY_CURRENT_USER`或`HKEY_LOCAL_MACHINE`。键将被评估为
|
|
定义变量的变量路径。如果路径不存在,它将被创建。如果在创建过程中发生任何错误,此调用将返回`FALSE`。请注意,此字符串可以包含描述更复杂路径的\字符。 |
|
如果调用结果为`TRUE`,则此参数的内容将作为一组值存储在子键`var`下。 |
对于字体,`var`不代表一个值,而是一个存储值的键。`LOGFONT`结构的以下组件被存储。请注意,这不是可能的完整值集。例如,我不需要存储字体旋转信息。
键 |
type |
含义 |
|
|
字体高度 |
|
|
字体粗细,FW_符号 |
|
|
斜体字体为`TRUE` |
|
|
带下划线字体为`TRUE` |
|
|
删除线字体为`TRUE` |
|
|
字体名称 |
[获取/设置]RegistryWindowPlacement 
BOOL GetRegistryWindowPlacement(HKEY root,
const CString & var, WINDOWPLACEMENT * val);
|
找到键的根,通常是`HKEY_CURRENT_USER`或`HKEY_LOCAL_MACHINE`。键将被评估为
|
|
定义变量的变量路径。如果路径不存在,则调用返回`FALSE`。请注意,此字符串可以包含描述更复杂路径的\字符。 |
|
此结构将首先完全清零。如果调用结果为`TRUE`,则`WINDOWPLACEMENT`的注册表信息的完整内容(由子键`var`下的值表示)将在此结构中找到。如果结果为`FALSE`,则字段将部分填充。 |
BOOL SetRegistryWindowPlacement(HKEY root, const CString & var, const WINDOWPLACEMENT * val);
|
找到键的根,通常是`HKEY_CURRENT_USER`或`HKEY_LOCAL_MACHINE`。键将被评估为
|
|
定义变量的变量路径。如果路径不存在,它将被创建。如果在创建过程中发生任何错误,此调用将返回`FALSE`。请注意,此字符串可以包含描述更复杂路径的\字符。 |
|
如果调用结果为`TRUE`,则此参数的内容将作为一组值存储在子键`var`下。 |
对于字体,`var`不代表值,而是一个存储值的键。`LOGFONT`结构的以下组件被存储。请注意,这不是所有可能值的完整集合。例如,我不需要存储字体旋转信息。此信息需要您在下表中定义字符串表键。如果您未定义键`IDS_KEY_PLACEMENT_FLAGS`,则`WINDOWPLACEMENT`函数将不可用。
在示例下载中,有一个文件resource.h包含这些符号,以及一个文件test.rc包含字符串表条目。
键 |
典型名称 |
type |
含义 |
|
|
|
结构的`flags`值 |
|
|
|
还原值,例如,`SW_MINIMIZE`、`SW_MAXIMIZE`或`SW_RESTORE` |
|
|
|
图标位置,左边缘。 |
|
|
|
图标位置,上边缘 |
|
|
|
最大化窗口位置,左边缘 |
|
|
|
最大化窗口位置,上边缘 |
|
|
|
规范化窗口位置,左边缘 |
|
|
|
规范化窗口位置,上边缘 |
|
|
|
规范化窗口位置,右边缘 |
|
|
|
规范化窗口位置,下边缘 |
[获取/设置]RegistryDWordArray 
CDWordArray * GetRegistryDWordArray(HKEY root, const CString & var);
|
找到键的根,通常是`HKEY_CURRENT_USER`或`HKEY_LOCAL_MACHINE`。键将被评估为
|
|
定义变量的变量路径。如果路径不存在,则调用返回`FALSE`。请注意,此字符串可以包含描述更复杂路径的\字符。 |
<code>return value |
如果成功,则返回一个新创建的`CDWordArray`对象。调用此函数的调用者有责任在不再需要此数组时删除它。如果发生错误,返回值为`NULL`。 |
BOOL SetRegistryDWordArray(HKEY root, const CString & var, CDWordArray & val);
|
找到键的根,通常是`HKEY_CURRENT_USER`或`HKEY_LOCAL_MACHINE`。键将被评估为
|
|
定义变量的变量路径。如果路径不存在,它将被创建。如果在创建过程中发生任何错误,此调用将返回`FALSE`。请注意,此字符串可以包含描述更复杂路径的\字符。 |
|
如果调用结果为`TRUE`,则此参数的内容将存储为`REG_BINARY`值。 |
DeleteRegistry[Key/Value] 
BOOL DeleteRegistryKey(HKEY root, const CString & keyname);
|
找到键的根,通常是`HKEY_CURRENT_USER`或`HKEY_LOCAL_MACHINE`。键将被评估为
|
|
定义键的变量路径。如果路径不存在,则调用返回`TRUE`。如果路径存在,则尝试删除它;如果成功删除,则返回值为`TRUE`。如果删除失败,则返回`FALSE`。 |
BOOL DeleteRegistryValue(HKEY root, const CString & var);
|
找到键的根,通常是`HKEY_CURRENT_USER`或`HKEY_LOCAL_MACHINE`。键将被评估为
|
|
定义变量的变量路径。如果路径不存在,则返回值为`TRUE`。如果路径存在,则变量将被删除。如果在删除过程中发生任何错误,此调用将返回`FALSE`。请注意,此字符串可以包含描述更复杂路径的\字符。 |
[获取/查找]RegistryKey 
BOOL GetRegistryKey(HKEY root, const CString & keyname, HKEY & key);
|
找到键的根,通常是`HKEY_CURRENT_USER`或`HKEY_LOCAL_MACHINE`。键将被评估为
|
|
定义父键的变量路径。如果路径不存在,则尝试创建它。如果创建成功,或者路径已存在,则设置`key`值,并且调用返回`TRUE`。如果路径不存在且无法创建,则调用返回`FALSE`。 |
|
表示由当前程序根目录的`keyname`路径定义的键的注册表键句柄。此值仅在函数返回`TRUE`时有效。 |
BOOL FindRegistryKey(HKEY root, const CString & keyname, HKEY & key);
|
找到键的根,通常是`HKEY_CURRENT_USER`或`HKEY_LOCAL_MACHINE`。键将被评估为
|
|
定义键的变量路径。如果路径不存在,则返回值为`FALSE`,并且不会尝试创建它。如果路径存在,则打开一个键句柄并在提供的`key`中返回。请注意,此字符串可以包含描述更复杂路径的\字符。 |
|
表示由当前程序根目录的`keyname`路径定义的键的注册表键句柄。此值仅在函数返回`TRUE`时有效。 |
EnumRegistry[Keys/Values] 
CStringArray * EnumRegistryKeys(HKEY root, const CString & keyname);
|
找到键的根,通常是`HKEY_CURRENT_USER`或`HKEY_LOCAL_MACHINE`。键将被评估为
|
|
定义父键的变量路径。如果路径不存在,则调用返回`NULL`。如果路径存在,则枚举子键并在生成的`CStringArray`中返回。调用者有责任删除返回的`CStringArray`。 |
CStringArray * EnumRegistryValues(HKEY root, const CString & keyname);
|
找到键的根,通常是`HKEY_CURRENT_USER`或`HKEY_LOCAL_MACHINE`。键将被评估为
|
|
定义父键的变量路径。如果路径不存在,则返回值为`NULL`。如果路径存在,则键下的所有值的名称都将在生成的`CStringArray`中返回。调用者有责任删除返回的`CStringArray`。请注意,此字符串可以包含描述更复杂路径的\字符。 |
这些文章中表达的观点是作者的观点,不代表,也不被微软认可。