首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >空的BSTR和空的BSTR之间应该有区别吗?

空的BSTR和空的BSTR之间应该有区别吗?
EN

Stack Overflow用户
提问于 2008-10-05 07:45:02
回答 2查看 8.8K关注 0票数 9

在维护COM接口时,是否应以与NULL相同的方式处理空BSTR?换句话说,这两个函数调用是否应该产生相同的结果?

代码语言:javascript
复制
 // Empty BSTR
 CComBSTR empty(L""); // Or SysAllocString(L"")
 someObj->Foo(empty);

 // NULL BSTR
 someObj->Foo(NULL);     
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2008-10-05 07:50:56

是-空BSTR与空BSTR相同。我记得当我们从VS6切换到2003年时,我们发现了各种各样的错误-- CComBSTR类对默认构造函数进行了更改,该构造函数使用NULL而不是空字符串来分配它。例如,当您将BSTR视为常规的C样式字符串并将其传递给某个函数(如strlen ),或者尝试用它初始化std::string时,就会发生这种情况。

Eric Lippert在Eric's Complete Guide To BSTR Semantics中非常详细地讨论了BSTR

让我先列出不同之处,然后再详细讨论每一点。

  1. BSTR对于NULL和for "“必须具有相同的语义。PWSZ通常具有不同的语义。

  1. 必须使用SysAlloc*系列函数分配和释放BSTR。PWSZ可以是堆栈中的自动存储缓冲区,也可以使用malloc、new、LocalAlloc或任何其他内存分配器进行分配。

  1. BSTR是固定长度的。PWSZ可以是任意长度,仅受其缓冲区中有效内存量的限制。

  1. BSTR总是指向缓冲区中的第一个有效字符。PWSZ可以是指向字符串缓冲区的中间或末尾的指针。

  1. 在分配n字节的BSTR时,您有空间容纳n/2个宽字符。当您为PWSZ分配n个字节时,您可以存储n/2-1个字符--您必须为null留出空间。

  1. BSTR可以包含任何Unicode数据,包括零字符。PWSZ从不包含零字符,除非用作字符串结束标记。BSTR和PWSZ在它们的最后一个有效字符之后总是有一个零字符,但在BSTR中,一个有效字符可以是一个零字符。

  1. BSTR实际上可能包含奇数个字节--它可以用来移动二进制数据。PWSZ几乎总是偶数个字节,并且仅用于存储Unicode字符串。
票数 14
EN

Stack Overflow用户

发布于 2008-10-05 10:55:35

处理这种困境的最简单方法是使用CComBSTR并检查.Length()是否为零。这对空值和空值都有效。

但是,请记住,必须释放空的BSTR,否则会有内存泄漏。我最近在其他人的代码中看到了其中的一些。很难找到,如果你不仔细看的话。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/171641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档