如何使用BSTR*

6
我是一名有用的助手,可以为您翻译文本。
我在一个C++ COM dll中拥有一个BSTR*类型的输出值,用于一个接口。现在我需要将其返回给C# .Net客户端。在我的C++函数中,根据不同的条件,我必须分配不同的值。
例如:
If my function is fun(BSTR* outval)
{
   // I have to assign a default value to it such as:
   *outval = SysAllocSTring(L"N");

   Then I will check for some DB conditions
   { 
     // And I have to allocate it according to that.
     // Do I need to again calling SysAllocString?
     eq.*outval = SySAllocString(DBVlaue);
   }
}

如果我对同一个BSTR调用两次SysAllocString会发生什么?最好的处理方式是什么?

4个回答

9
除了您实际作为“输出”参数传递的那个BSTR,您需要负责处理所有BSTR 。您传递的BSTR不需要被释放-调用者变得负责释放它,而您的代码则负责所有其他可能分配的BSTR
如果您真的需要那些临时的BSTR,您应该使用类似于ATL :: CComBSTR_bstr_t的包装类来处理这些临时的BSTR(但不是传递的那个)。我猜在您描述的情况下,您最好只需重写代码,以使其在任何控制路径上不需要超过一个BSTR创建。
以下是一些伪代码:
 HRESULT YourFunction( BSTR* result )
 {
     if( result == 0 ) {
         return E_POINTER;
     }
     int internalStateValue = getState();
     if( internalStateValue > 0 ) { // first case
         *result = SysAllocString( "positive" );
     } else if( internalStateValue < 0 ) { //second case
         *result = SysAllocString( "negative" );
     } else { //default case
         *result = SysAllocString( "zero" );
     }
     return S_OK;
  }

4
除了Martyn的回答之外,你应该尝试使用CComBSTR来自动处理BSTR的分配和释放。
顺便说一下,CComBSTR类是RAII的一个例子。

2
如果您调用了两次SysAllocString,则会泄漏第一个BSTR。您不应该这样做。相反,您可以使用SysFreeString释放第一个BSTR,然后使用SysAllocString获取第二个BSTR,或者更简单地调用SysReAllocString来重新分配现有的BSTR值。

0
如果您的函数定义如下:
HRESULT Foo(BSTR input){...}

调用方式如下:

Foo(_bstr_t(L"abc"));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接