将 null BSTR(空 WCHAR* 指针)视为空字符串并相应地设计所有操作 BSTR 的代码至少是常见的做法。答复 这个问题 说同样的。

这种做法记录在哪里?有没有官方文件描述这个约定?

有帮助吗?

解决方案

嗯,该问题的答案中给出的链接是Eric Lippert的一篇文章, Eric完整的BSTR语义指南。虽然它绝对不会成为官方文档,但Lippert是COM的知名权威(特别是在脚本领域)。

但是,官方文档可以这样说:

  

没有数据元素的BSTR是空BSTR或空BSTR。空BSTR指示当前但零长度的数据值。 NULL BSTR表示不存在的数据值。

因此,正式它们都是 BSTR ,没有数据元素,但语义略有不同(尽管没有什么可说的,这两种情况需要在应用程序中以不同的方式处理)。在这种情况下,我肯定会遵循Lippert关于同样对待它们的建议。对我而言,他对实际实施工作的真实经验比官方BSTR文档中的一句话更重要。

其他提示

迈克尔·伯尔给出了我认为应该被接受的答案。不幸的是,该页面 BSTR MSDN 中没有记录这种做法。

此外,您还可以从 MSDN 文档中的以下页面推断出此行为:

  • SysFreeString 页面报告说,如果 bstrnull 该函数只是返回。
  • SysStringLen 页面报告通过 null 为了 bstr 参数返回零作为字符串长度。
  • SysStringByteLen 页面报告相同的行为; null 意味着零长度。

但是,文档并不完整:

将null BSTR处理为空字符串接缝是一种常见做法,但Microsoft发现的技术文档实际上表明 是这两者之间的差异。

  

对于引用[MS-DTYP]和[MS-OAUT]的任何文档,指定   线表示上下文中的BSTR必须被视为a   参考发送的BSTR类型,同时在a中指定BSTR   内存表示上下文必须被视为对它的引用   提出BSTR类型([MS-DTYP]第2.2.5节)。反映了   用于呈现的BSTR,NULL BSTR或NULL的术语   BSTR,被定义为呈现空值的BSTR的线表示;   并且空的BSTR或空的发送的BSTR被定义为线路   表示零长度的BSTR。 保留这个   线表示中的区别使客户端和服务器能够   区分NULL呈现的BSTR和呈现的零长度   BSTR,因此可能与应用程序不同   这两个值的语义。

https://msdn.microsoft.com/en-us/library /cc237580.aspx

因此,无论他们是否处理相同或不同,都取决于实现。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top