将空 BSTR(空 WCHAR* 指针)视为空字符串并相应地设计所有操作 BSTR 的代码至少是一种常见的做法。这个问题的答案是一样的。
这种做法记录在哪里?有没有描述这个约定的官方文件?
好吧,该问题的已接受答案中给出的链接是 Eric Lippert 的一篇文章,Eric's Complete Guide To BSTR Semantics。虽然它绝对不是官方文档,但 Lippert 是 COM 的知名权威(尤其是在脚本领域)。
但是,官方文档有这样的说法:
没有数据元素的 BSTR 要么是空 BSTR,要么是 NULL BSTR。空 BSTR 表示存在但长度为零的数据值。NULL BSTR 表示不存在的数据值。
因此,正式地它们都是BSTR
没有数据元素的 s,但语义略有不同(尽管没有什么可以说这两种情况需要在您的应用程序中以不同方式处理)。在这种情况下,我当然会听从 Lippert 的建议,对他们一视同仁。对我来说,他在实际实现工作方面的实际经验比官方 BSTR 文档中的一句话更重要。
Michael Burr 给出了我认为应该被接受的答案。不幸的是BSTR
,MSDN 中的页面没有记录这种做法。
此外,您可以从 MSDN 文档中的这些页面推断此行为:
SysFreeString
page 报告 if bstr
isnull
函数简单地返回。SysStringLen
null
page 报告为参数传递 abstr
返回字符串长度为零。SysStringByteLen
页面报告相同的行为;null
表示零长度。但是,文档并不完整:
SysReAllocString
没有提到如果*pbstr
是会发生什么null
。SysReAllocStringLen
没有提到如果*pbstr
是会发生什么null
。将空 BSTR 处理为空字符串接缝是一种常见做法,但在 Microsoft 找到的技术文档实际上指出这两者之间存在差异。
对于同时引用 [MS-DTYP] 和 [MS-OAUT] 的任何文档,在线路表示上下文中指定 BSTR 必须被视为对传输的 BSTR 类型的引用,而在内存表示上下文中指定 BSTR 必须被视为引用到呈现的 BSTR 类型([MS-DTYP] 第 2.2.5 节)。反映用于呈现的 BSTR 的术语,NULL BSTR,或 NULL 传输的 BSTR,被定义为 NULL 呈现的 BSTR 的线表示;一个空的 BSTR,或空传输的 BSTR,被定义为一个零长度的 BSTR 的线表示。Preserving this distinction in the wire representation enables clients and servers to distinguish between NULL presented BSTRs and zero-length presented BSTRs, and thus associate possibly different, application-specific semantics to these two values.
https://msdn.microsoft.com/en-us/library/cc237580.aspx
So it's up to the implementations whether they handle both equal or not.