注册表值类型

注册表值 可以存储多种格式之一的数据,例如字符串值或整数值。 在注册表值(例如通过调用 RegSetValueEx 函数)中存储数据时,可以通过指定下表中的其中一种类型来指示要存储的数据类型。 检索注册表值时,RegQueryValueEx 等函数 使用这些类型来指示检索的数据类型。

winnt.h 头文件中定义了以下注册表值类型:

价值 类型
REG_BINARY 任何形式的二进制数据。
REG_DWORD 32 位数字。
REG_DWORD_LITTLE_ENDIAN 小端格式的 32 位数字。 Windows 设计为在小端计算机体系结构上运行。 因此,此值在 Windows 头文件中定义为 REG_DWORD
REG_DWORD_BIG_ENDIAN 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_SZREG_MULTI_SZREG_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

这些术语是乔纳森·斯威夫特讽刺小说 格利弗旅行的轻心文化参考。