【发布时间】:2015-03-11 05:07:26
【问题描述】:
当调用一个需要 BSTR 的函数时,最好能够编写如下内容:
iFoo->function( bs"HELLO" );
但是我知道的唯一解决方法是使用调用 SysAllocString 等的包装器,例如:
iFoo->function( WideString(L"HELLO").c_bstr() );
这有点难看。实际上是否有这样的选项来创建 BSTR 文字?
动机:通过避免分配和释放,代码更易于阅读,运行时性能更快。
澄清:我只讨论调用者(即我们)拥有 BSTR 所有权的情况,例如:调用一个带有BSTR [in] 参数的函数。当然,将指向 BSTR 文字的指针提供给将继续尝试释放字符串的函数是愚蠢的。
【问题讨论】:
-
不仅丑,还要等到有人打电话给
SysFreeString():) -
BSTR 是按定义动态管理的。这个概念当然可以被扔进文字中,但它不会是 BSTR。如果在最终被释放的地方使用它,那将是灾难性的。 OLE 库有许多 位置(变体函数、编组器代码等),其中诸如 VARIANT 成员之类的东西在幕后进行管理。在这样的地方放置这样的东西将是灾难性的。您可以随时使用任何预制 BSTR 智能指针类,例如
bstr_t或CComBSTR。 -
@MattMcNabb 为什么要释放一个已经被释放的 BSTR?例如
VariantChangeType,从加载的VARIANT调用,其中“1000”的“文字”无效 BSTR 更改为VT_LONG将是来自椽子的 UB。 BSTR[in,out]按定义编组将释放输入BSTR并将其替换为输出-BSTR 多次。在字面 BSTR 中有 zero 意义。我刚刚重读了您的评论,我认为您同意。我同意,发送[in] BSTR的东西不应该释放它(当然SysFreeString除外)。 -
回答我自己的问题...我猜一些内存检查工具可能会尝试检查提供给期望 BSTR 的函数的任何指针实际上是否与 OLE 分配表中存在的内容相对应
-
@WhozCraig 刚才试过了,here is the result ...
标签: c++ c++builder bstr