【发布时间】:2009-05-06 06:32:56
【问题描述】:
将空 BSTR(空 WCHAR* 指针)视为空字符串,并相应地设计所有操作 BSTR 的代码,这至少是一种常见的做法。对this question 的回答也是如此。
这种做法记录在哪里?有没有官方文档描述这个约定?
【问题讨论】:
标签: windows com interop com-interop bstr
将空 BSTR(空 WCHAR* 指针)视为空字符串,并相应地设计所有操作 BSTR 的代码,这至少是一种常见的做法。对this question 的回答也是如此。
这种做法记录在哪里?有没有官方文档描述这个约定?
【问题讨论】:
标签: windows com interop com-interop bstr
嗯,该问题的已接受答案中给出的链接是 Eric Lippert 的一篇文章,Eric's Complete Guide To BSTR Semantics。虽然它绝对不是官方文档,但 Lippert 是 COM 的知名权威(尤其是在脚本领域)。
不过,the official documentation 有话要说:
没有数据元素的 BSTR 要么是空 BSTR,要么是 NULL BSTR。空 BSTR 表示存在但长度为零的数据值。 NULL BSTR 表示不存在的数据值。
所以,正式地它们都是BSTRs,没有数据元素,但语义略有不同(尽管没有什么可以说这两种情况需要在您的应用程序中以不同方式处理)。在这种情况下,我当然会听从 Lippert 的建议,对他们一视同仁。对我来说,他在实际实现工作方面的实际经验比 BSTR 官方文档中的一句话更有分量。
【讨论】:
Michael Burr 给出了我认为应该被接受的答案。很遗憾,MSDN 中BSTR 的页面没有记录这种做法。
此外,您可以从 MSDN 文档中的这些页面推断此行为:
SysFreeString 页面报告如果 bstr 是 null,则函数简单地返回。SysStringLen 页面报告为 bstr 参数传递 null 返回字符串长度为零。SysStringByteLen 页面报告相同的行为; null 表示零长度。但是,文档并不完整:
SysReAllocString 没有提到如果 *pbstr 是 null 会发生什么。SysReAllocStringLen 没有提到如果 *pbstr 是 null 会发生什么。【讨论】:
将空 BSTR 处理为空字符串接缝是一种常见做法,但在 Microsoft 找到的技术文档实际上表明 这两者之间存在差异。
对于同时引用 [MS-DTYP] 和 [MS-OAUT] 的任何文档,指定 线表示上下文中的 BSTR 必须被视为 引用传输的 BSTR 类型,同时在 a 中指定 BSTR 内存表示上下文必须被视为对 呈现 BSTR 类型([MS-DTYP] 第 2.2.5 节)。反映 用于呈现的 BSTR、NULL BSTR 或传输的 NULL 的术语 BSTR,被定义为一个 NULL 呈现的 BSTR 的线表示; 一个空的 BSTR,或空的传输 BSTR,被定义为线 表示一个零长度的 BSTR。 保留这个 有线表示的区别使客户端和服务器能够 区分 NULL 呈现的 BSTR 和零长度呈现 BSTR,因此关联可能不同的、特定于应用程序的 这两个值的语义。
https://msdn.microsoft.com/en-us/library/cc237580.aspx
因此,它们是否处理相等取决于实现。
【讨论】: