当前位置:  开发笔记 > Android > 正文

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

如何解决《空BSTR和NULLBSTR之间应该有区别吗?》经验,为你挑选了2个好方法。

在维护COM接口时应该BSTR像对待空方式一样对待NULL?换句话说,这两个函数调用应该产生相同的结果吗?

 // Empty BSTR
 CComBSTR empty(L""); // Or SysAllocString(L"")
 someObj->Foo(empty);

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

1800 INFORMA.. 14

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

Eric Lippert在Eric的BSTR语义完全指南中详细讨论了BSTR :

让我先列出差异,然后讨论令人难以忍受的细节.

1)BSTR必须具有相同的NULL和""语义.PWSZ经常具有不同的语义.

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

3)BSTR具有固定长度.PWSZ可以是任何长度,仅受其缓冲区中有效存储器的数量的限制.

4)BSTR始终指向缓冲区中的第一个有效字符.PWSZ可以是指向字符串缓冲区的中间或末尾的指针.

5)当分配n字节BSTR时,你有n/2个宽字符的空间.为PWSZ分配n个字节时,可以存储n/2 - 1个字符 - 必须为空值留出空间.

6)BSTR可以包含任何Unicode数据,包括零字符.除了作为字符串结束标记之外,PWSZ永远不包含零字符.BSTR和PWSZ在它们的最后一个有效字符之后总是具有零字符,但是在BSTR中,有效字符可以是零字符.

7)BSTR实际上可能包含奇数个字节 - 它可用于移动二进制数据.PWSZ几乎总是偶数个字节,仅用于存储Unicode字符串.

紧握着手 - 我经历过不遵守NULL ==空规则的MSXML代码,并展示了两者的不同行为.但那是5年前(MSXML 3,如果我没记错的话),希望他们现在已经解决了这个问题.:-) (4认同)

.NET interops也不遵守规则 - 它们将""编组为String.Empty,将NULL编组为null. (2认同)


HS... 5

解决此难题的最简单方法是使用CComBSTR并检查.Length()是否为零。这适用于空值和NULL值。

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



1> 1800 INFORMA..:

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

Eric Lippert在Eric的BSTR语义完全指南中详细讨论了BSTR :

让我先列出差异,然后讨论令人难以忍受的细节.

1)BSTR必须具有相同的NULL和""语义.PWSZ经常具有不同的语义.

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

3)BSTR具有固定长度.PWSZ可以是任何长度,仅受其缓冲区中有效存储器的数量的限制.

4)BSTR始终指向缓冲区中的第一个有效字符.PWSZ可以是指向字符串缓冲区的中间或末尾的指针.

5)当分配n字节BSTR时,你有n/2个宽字符的空间.为PWSZ分配n个字节时,可以存储n/2 - 1个字符 - 必须为空值留出空间.

6)BSTR可以包含任何Unicode数据,包括零字符.除了作为字符串结束标记之外,PWSZ永远不包含零字符.BSTR和PWSZ在它们的最后一个有效字符之后总是具有零字符,但是在BSTR中,有效字符可以是零字符.

7)BSTR实际上可能包含奇数个字节 - 它可用于移动二进制数据.PWSZ几乎总是偶数个字节,仅用于存储Unicode字符串.


紧握着手 - 我经历过不遵守NULL ==空规则的MSXML代码,并展示了两者的不同行为.但那是5年前(MSXML 3,如果我没记错的话),希望他们现在已经解决了这个问题.:-)
.NET interops也不遵守规则 - 它们将""编组为String.Empty,将NULL编组为null.

2> HS...:

解决此难题的最简单方法是使用CComBSTR并检查.Length()是否为零。这适用于空值和NULL值。

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

推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有