注册表值类型
注册表值可以存储各种格式的数据。 在注册表值下存储数据(例如通过调用 RegSetValueEx 函数)时,可以指定以下值之一来指示要存储的数据类型。 检索注册表值时, RegQueryValueEx 等函数使用这些值来指示检索的数据类型。
Winnt.h 中定义了以下注册表值类型。
| 值 | 类型 |
|---|---|
| REG_BINARY | 任意格式的二进制数据。 |
| REG_DWORD | 32 位数字。 |
| REG_DWORD_LITTLE_ENDIAN | 采用小端格式的 32 位数字。 Windows旨在在小端计算机体系结构上运行。 因此,此值在Windows头文件中定义为REG_DWORD。 |
| REG_DWORD_BIG_ENDIAN | 采用大端格式的 32 位数字。 一些UNIX系统支持大端体系结构。 |
| REG_EXPAND_SZ | 一个 null 终止的字符串,其中包含对环境变量的未展开引用 (,例如,“%PATH%”) 。 它将是 Unicode 或 ANSI 字符串,具体取决于是使用 Unicode 还是 ANSI 函数。 若要展开环境变量引用,请使用 ExpandEnvironmentStrings 函数。 |
| REG_LINK | 一个以 null 结尾的 Unicode 字符串,其中包含通过调用具有REG_OPTION_CREATE_LINK的 RegCreateKeyEx 函数创建的符号链接的目标路径。 |
| REG_MULTI_SZ | 由空字符串 (\0) 终止的空字符串序列。 下面是一个示例:String1\0String2\0String3\0LastString\0\0 第一个 \0 终止第一个字符串,第二个到最后一个 \0 终止最后一个字符串,最后 \0 终止序列。 请注意,最终终止符必须计入字符串的长度。 |
| REG_NONE | 没有定义的值类型。 |
| REG_QWORD | 64 位数字。 |
| REG_QWORD_LITTLE_ENDIAN | 采用小端格式的 64 位数字。 Windows旨在在小端计算机体系结构上运行。 因此,此值在Windows头文件中定义为REG_QWORD。 |
| REG_SZ | 以 null 终止的字符串。 这可以是 Unicode 还是 ANSI 字符串,具体取决于是使用 Unicode 还是 ANSI 函数。 |
字符串值
如果数据具有REG_SZ、REG_MULTI_SZ或REG_EXPAND_SZ类型,则字符串可能未使用正确的终止 null 字符进行存储。 因此,从注册表读取字符串时,必须确保字符串在使用之前正确终止;否则,它可能会覆盖缓冲区。 (请注意,REG_MULTI_SZ字符串应有两个终止 null 字符。)
将字符串写入注册表时,必须指定字符串的长度,包括终止 null 字符 (\0) 。 常见的错误是使用 strlen 函数来确定字符串的长度,但忘记 strlen 只返回字符串中的字符数,不包括终止 null。 因此,应按如下所示计算字符串的长度: strlen( string ) + 1
REG_MULTI_SZ字符串以长度为 0 的字符串结尾。 因此,不能在序列中包含零长度字符串。 空序列的定义如下:\0。
以下示例演练REG_MULTI_SZ字符串。
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
void SampleSzz(PTSTR pszz)
{
_tprintf(_TEXT("\tBegin multi-sz string\n"));
while (*pszz)
{
_tprintf(_TEXT("\t\t%s\n"), pszz);
pszz = pszz + _tcslen(pszz) + 1;
}
_tprintf(_TEXT("\tEnd multi-sz\n"));
}
int __cdecl main(int argc, char **argv)
{
// Because the compiler adds a \0 at the end of quoted strings,
// there are two \0 terminators at the end.
_tprintf(_TEXT("Conventional multi-sz string:\n"));
SampleSzz(_TEXT("String1\0String2\0String3\0LastString\0"));
_tprintf(_TEXT("\nTest case with no strings:\n"));
SampleSzz(_TEXT(""));
return 0;
}
字节格式
以 小端格式,多字节值存储在内存中,从“小端” (“小端”) 到最高字节。 例如,值0x12345678以小端格式存储为 (0x78 0x56 0x34 0x12) 。
以 big-endian 格式,多字节值存储在内存中,从“大端”) 到最低字节 (内存中。 例如,值0x12345678以大端格式存储为 (0x12 0x34 0x56 0x78) 。