据我所知,在Windows注册表中创建的字符串(REG_SZ)必须以0字节终止。 但是,如果您想以编程方式创建没有内容的注册表值,会发生什么?
a)总是以0字节终止(如果注册表值有内容,则无关紧要)
b)如果有内容
,则仅使用0字节终止谢谢!
答案 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或任何程序的错误消息。