在Windows注册表中,字符串中是否需要转义斜杠?

5
这是一个关于WinAPI RegSetValueEx的问题。如果您查看MSDN这里的描述,您会发现: lpData [in]要存储的数据。 REG_SZ,字符串必须以null结尾。对于REG_MULTI_SZ数据类型,字符串必须以两个空字符结尾。反斜杠必须被另一个反斜杠作为转义字符。例如,指定“C:\ mydir \ myfile”来存储字符串“C:\ mydir \ myfile”。
我的问题是,我真的需要转义斜杠吗?因为我以前从未这样做过,它完美地工作。

转化字符是针对 C++ 的,而不是针对该方法。例如,如果你要从命令行获取用户输入,你不需要将所有的 \ 转换为 \。但是,如果你要在代码中使用字符串字面量,比如 "C:...",你就需要在 C++ 源代码中写成 "C:\..."。我猜这就是文档所指的内容。也有可能这个页面实际上意味着你需要做 "C:\\..."(在这种情况下,你可能需要转换用户输入)。 - Corbin
@Corbin :) 好的,这很重要。文档中的表述非常令人困惑。 - ahmd0
+1 好问题,这份文档真的很奇怪。 - David Heffernan
1
如果我必须猜测的话,我会认为它的意思是你必须实际传递它,而不是在源代码中使用\来表示单个斜杠。只需插入一个带有“\\”的条目,看看它是否显示为“\”或“\”。如果它显示为“\”,那么你必须实际转义斜杠,而如果它显示为“\\”,那么它只是提醒人们在C++中\是一个特殊字符并且必须转义。我觉得这份文档可以用一些明确的语言来显著改进... 哈哈 - Corbin
2个回答

8

这确实是一份文档错误。在此处无需转义反斜杠。您发送到此API的确切字符串将存储在注册表中。不会执行反斜杠的处理。

现在,虽然在C和C ++中需要转义字符串文字中的某些字符,但这与Win32 API文档无关。这是特定语言的源代码到目标代码转换的问题,远超出了本文档的范围。


的确。关键部分是在字符串字面量中转义反斜杠字符。 - André Caron

2
是的,因为在C++中\具有特殊含义,而\\则表示普通的反斜杠。
\出现在字符串中时,C++编译器会查看下一个字符并将其转换为某些内容(例如\n将被转换为“换行符”)。\\将被转换为常规反斜杠。这称为“转义”(在旧终端上,ESC +键组合用于许多不在键盘上的键)。

2
是的,C++。当然我知道在C中需要用斜杠转义一些字符。但他们将其放入了一个与C++或任何其他语言无关的Windows API描述中。再次强调,我想知道微软是否希望我们转义传递给注册表API的字符串。 - ahmd0
2
@littleadv ahmd0是对的,MSDN页面没有提到语言。那个页面的写法完全令人困惑。 - Mr Lister
5
你的说法完全错误。我可以使用VB或C#或纯汇编或任何其他语言来调用那些API。这与编程语言无关。所以,重点是,各位,不需要转义斜杠(在内存中)字符串,对吗? - ahmd0
2
@littleadv 如果这只是关于C语言的问题,为什么页面只提到反斜杠而不是引号和其他在C语言中需要转义的字符? - Mr Lister
3
@s3rius:这份文档是通用的,因为这个API是语言中立的。车辆没有起到任何帮助作用。 - David Heffernan
显示剩余11条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接