在维护COM接口时,是否应以与NULL相同的方式处理空BSTR?换句话说,这两个函数调用是否应该产生相同的结果?
// Empty BSTR
CComBSTR empty(L""); // Or SysAllocString(L"")
someObj->Foo(empty);
// NULL BSTR
someObj->Foo(NULL); 发布于 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
让我先列出不同之处,然后再详细讨论每一点。
发布于 2008-10-05 10:55:35
处理这种困境的最简单方法是使用CComBSTR并检查.Length()是否为零。这对空值和空值都有效。
但是,请记住,必须释放空的BSTR,否则会有内存泄漏。我最近在其他人的代码中看到了其中的一些。很难找到,如果你不仔细看的话。
https://stackoverflow.com/questions/171641
复制相似问题