首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用BSTR*

如何使用BSTR*
EN

Stack Overflow用户
提问于 2011-05-27 13:10:32
回答 4查看 11.7K关注 0票数 6

对于C++ COM dll中的接口,我的out值为BSTR*。我要将此文件返回给C# .Net客户端。在我的C++函数中,我必须根据不同的条件分配不同的值。

例如:

代码语言:javascript
复制
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两次,会发生什么情况?处理这个问题的最好方法是什么?

EN

回答 4

Stack Overflow用户

发布于 2011-05-27 16:28:02

除了实际作为“BSTR”参数传递的参数之外,您必须处理所有的输出。您传递的BSTR不需要被释放-调用者负责释放它,而您的代码负责它可以分配的所有其他BSTR

如果您真的需要这些临时BSTR,那么您应该对这些临时BSTR使用像ATL::CComBSTR_bstr_t这样的包装类(但不是对于您传出的那个)。我猜,在您描述的情况下,只需以这样的方式重写代码会更好,这样您就不需要在任何控制路径上创建多个BSTR

下面是一些伪代码:

代码语言:javascript
复制
 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;
  }
票数 9
EN

Stack Overflow用户

发布于 2011-05-27 13:46:04

除了Martyn已经回答的问题之外,您应该尝试使用CComBSTR,它将自动处理分配和释放BSTR。

顺便说一句,CComBSTR类是RAII的一个例子

票数 3
EN

Stack Overflow用户

发布于 2011-05-27 13:25:43

如果调用SysAllocString两次,就会泄漏第一个BSTR。您不应该这样做。您可以在第一个BSTR上执行SysFreeString,然后在第二个BSTR上执行SysAllocString,或者更简单地调用SysReAllocString来重新分配现有的BSTR值。

马丁

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6148068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档