至少通常的做法是将null BSTR(null WCHAR *指针)视为空字符串,并设计相应操作BSTR的所有代码。 this question的答案也是这样说的。
这种做法记录在哪里?有没有描述这个惯例的官方文件?
答案 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)
BSTR
的页面没有记录这种做法。
此外,您可以在MSDN文档中的这些页面中推断出此行为:
SysFreeString
页面报告如果bstr
为null
,则该功能只会返回。SysStringLen
页面报告为null
参数传递bstr
会为字符串长度返回零。SysStringByteLen
页面报告了相同的行为; null
表示零长度。但是,文档不完整:
SysReAllocString
未提及如果*pbstr
为null
会发生什么。SysReAllocStringLen
未提及如果*pbstr
为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
因此无论他们是否处理相同或不同,它都可以实现。