空 BSTR 和 NULL BSTR 之间应该有区别吗? [英] Should there be a difference between an empty BSTR and a NULL BSTR?

查看:25
本文介绍了空 BSTR 和 NULL BSTR 之间应该有区别吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

When maintaining a COM interface should an empty BSTR be treated the same way as NULL? In other words should these two function calls produce the same result?

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

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

推荐答案

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

Yes - a NULL BSTR is the same as an empty one. I remember we had all sorts of bugs that were uncovered when we switched from VS6 to 2003 - the CComBSTR class had a change to the default constructor that allocated it using NULL rather than an empty string. This happens when you for example treat a BSTR as a regular C style string and pass it to some function like strlen, or try to initialise a std::string with it.

Eric Lippert 在 Eric 的 BSTR 语义完整指南:

Eric Lippert discusses BSTR's in great detail in Eric's Complete Guide To BSTR Semantics:

让我先列出差异,然后然后讨论中的每一点令人痛苦的细节.

Let me list the differences first and then discuss each point in excruciating detail.

  1. BSTR 必须具有相同的NULL 和"的语义.一个 PWSZ经常有不同的语义那些.

  1. A BSTR must have identical semantics for NULL and for "". A PWSZ frequently has different semantics for those.

必须分配和释放 BSTR与 SysAlloc* 系列职能.PWSZ 可以是从自动存储缓冲区堆栈或使用 malloc、new、LocalAlloc 或任何其他内存分配器.

A BSTR must be allocated and freed with the SysAlloc* family of functions. A PWSZ can be an automatic-storage buffer from the stack or allocated with malloc, new, LocalAlloc or any other memory allocator.

BSTR 是固定长度的.一个 PWSZ可以是任意长度,仅受以下限制它的有效内存量缓冲区.

A BSTR is of fixed length. A PWSZ may be of any length, limited only by the amount of valid memory in its buffer.

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

A BSTR always points to the first valid character in the buffer. A PWSZ may be a pointer to the middle or end of a string buffer.

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

When allocating an n-byte BSTR you have room for n/2 wide characters. When you allocate n bytes for a PWSZ you can store n / 2 - 1 characters -- you have to leave room for the null.

BSTR 可以包含任何 Unicode 数据包括零字符.一个 PWSZ从不包含零字符除了作为字符串结束标记.BSTR 和 PWSZ 总是有一个最后一个有效字符后的零字符字符,但在 BSTR 中是有效的字符可能是零字符.

A BSTR may contain any Unicode data including the zero character. A PWSZ never contains the zero character except as an end-of-string marker. Both a BSTR and a PWSZ always have a zero character after their last valid character, but in a BSTR a valid character may be a zero character.

一个 BSTR 实际上可能包含一个奇数字节数——它可以用于移动二进制数据.PWSZ 是几乎总是偶数字节并且仅用于存储 Unicode字符串.

A BSTR may actually contain an odd number of bytes -- it may be used for moving binary data around. A PWSZ is almost always an even number of bytes and used only for storing Unicode strings.

这篇关于空 BSTR 和 NULL BSTR 之间应该有区别吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆