我是否必须使用0字节终止空REG_SZ值?

时间:2011-09-12 12:46:54

标签: windows string registry

据我所知,在Windows注册表中创建的字符串(REG_SZ)必须以0字节终止。 但是,如果您想以编程方式创建没有内容的注册表值,会发生什么?

a)总是以0字节终止(如果注册表值有内容,则无关紧要)

b)如果有内容

,则仅使用0字节终止

谢谢!

3 个答案:

答案 0 :(得分:2)

您必须始终使用null 字符终止该值。如果没有内容,则该值将是一个空字符而不是其他内容。

请注意,字符长度为一个或两个字节,具体取决于您使用的是ANSI还是Unicode API。

更新:RegSetValueEx州有关其最后一个参数的文档:

  

lpData参数指向的信息大小   字节。如果数据类型为REG_SZ,REG_EXPAND_SZ或REG_MULTI_SZ,   cbData必须包含终止空字符的大小或   字符。

registry value types reference也说:

  

字符串值

     

如果数据具有REG_SZ,REG_MULTI_SZ或REG_EXPAND_SZ类型,则   字符串可能没有与正确的终止null一起存储   字符。因此,当您从注册表中读取字符串时   必须确保在使用之前正确终止字符串;   否则,它可能会覆盖缓冲区。 (注意REG_MULTI_SZ字符串   应该有两个终止空字符。)

     

将字符串写入注册表时,必须指定长度   字符串,包括终止空字符(\ 0)。普通的   错误是使用strlen函数来确定长度   字符串,但要忘记strlen只返回数字   字符串中的字符,不包括终止null。   因此,字符串的长度应按如下方式计算:   strlen(string)+ 1

现在所有这一切都不尽如人意,但众所周知,Unicode字符串中的空终止符实际上是两个字节(就像BMP中的每个其他Unicode字符一样)。

答案 1 :(得分:2)

目前尚不清楚“无内容”是什么意思。如果存在,则注册表值始终具有内容。

如果要查询值失败,请不要使用REG_SZ创建它。相反,根本就不要创建它。

如果要查询该值以返回空字符串,则创建为REG_SZ,其中包含一个空字节(如果是ANSI)或两个空字节(如果是UNICODE)。

答案 2 :(得分:1)

虽然规则是使用a) - 根据我的经验,a)和b)实际上都可以工作。

通过使用RegScanner之类的工具,您可以搜索长度为"从0字节到1字节"的所有 REG_SZ 条目。

执行此操作时,您确实会看到大多数条目长度为1个字节(即它们是空字符串,以null结尾)。

在我的电脑上,有75322"空"总计 REG_SZ 条目,其中74860条目为1字节。

然而,462个条目的大小为0字节,这意味着它们以null结尾,它们只是.. ..empty,如完全为空

其中大部分" 0字节"条目属于一些程序。

首先,这里有一些第三方程序实际上创建了 REG_SZ 条目(带有名称),只是它们根本没有包含任何东西..

ACD Systems - ACDSee Pro 5 ,169条目:

    [HKLM\SOFTWARE\Classes\.***\OpenWithProgids]
    "ACDSee Pro 5.***"=""

Disc Soft - 守护程序工具,20个条目:

    [HKLM\SOFTWARE\Wow6432Node\Disc Soft\DAEMON Tools Pro\FileTypesSave\.***]
    "Type"=""

PSP Audioware - PSP MultiInstaller ,105条目:

    [HKCU\Software\PSP-audioware\PSP_*]
    "CurrBank"=""
    "CurrDir"=""
    "CurrPreset"=""

但是,在Windows 7(至少SP1)中,还有一些非空终止的 REG_SZ 字符串,但是,这些是正常的(默认)空字符串..

Microsoft - Windows 7 SP1 AppEvents \ Schemes ,67个条目:

    [HKCU\AppEvents\Schemes\Apps\.*\*\.None]
    @=""

那些 .Current 也是空的,有这些:

    [HKCU\AppEvents\Schemes\Apps\.*\*\.Current]
    @=""

所有这些非空终止的 REG_SZ 注册表设置似乎都在工作......尽管实际上测试并不容易,它们是空的,所有.. ..但至少,当它们遍历这些注册表项时,没有来自Windows或任何程序的错误消息。