在哪里使用null BSTR记录?

时间:2009-05-06 06:32:57

标签: windows com interop com-interop bstr

至少通常的做法是将null BSTR(null WCHAR *指针)视为空字符串,并设计相应操作BSTR的所有代码。 this question的答案也是这样说的。

这种做法记录在哪里?有没有描述这个惯例的官方文件?

3 个答案:

答案 0 :(得分:6)

嗯,在接受该问题的答案中给出的链接是Eric Lippert撰写的一篇文章,Eric's Complete Guide To BSTR Semantics。虽然它绝对不会成为官方文档,但Lippert是COM的知名权威(特别是在脚本领域)。

然而,the official documentation有这样的说法:

  

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

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

答案 1 :(得分:4)

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

此外,您可以在MSDN文档中的这些页面中推断出此行为:

  • SysFreeString页面报告如果bstrnull,则该功能只会返回。
  • SysStringLen页面报告为null参数传递bstr会为字符串长度返回零。
  • SysStringByteLen页面报告了相同的行为; null表示零长度。

但是,文档不完整:

答案 2 :(得分:1)

将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

因此无论他们是否处理相同或不同,它都可以实现。