如何使用BSTR *

时间:2011-05-27 05:10:32

标签: com bstr

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

例如:

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);
   }
}

如果我将SysAllocSTring两次拨打到同一个BSTR会怎样?处理这个问题的最佳方法是什么?

4 个答案:

答案 0 :(得分:9)

您必须处理除实际传递的所有BSTR之外的所有BSTR作为“out”参数。您传递的BSTR无需释放 - 调用者负责释放它,并且您的代码负责其可能已分配的所有其他BSTR

如果您确实需要这些临时ATL::CComBSTR,那么您应该使用_bstr_tBSTR这样的包装类来处理那些临时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; }

这是一些伪代码:

{{1}}

答案 1 :(得分:3)

除了Martyn的答案之外,你应该尝试使用CComBSTR来自动处理分配和释放BSTR。

BTW,CComBSTR类是RAII

的一个例子

答案 2 :(得分:2)

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

马丁

答案 3 :(得分:0)

如果您的功能定义为:

HRESULT Foo(BSTR input){...}

称之为:

Foo(_bstr_t(L"abc"));