对于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会怎样?处理这个问题的最佳方法是什么?
答案 0 :(得分:9)
您必须处理除实际传递的所有BSTR
之外的所有BSTR
作为“out”参数。您传递的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;
}
。
这是一些伪代码:
{{1}}
答案 1 :(得分:3)
答案 2 :(得分:2)
如果您两次调用SysAllocString,您将泄漏第一个BSTR。你不应该这样做。您可以在第一个BSTR上使用SysFreeString,然后在第二个BSTR上使用SysAllocString,或者更简单地调用SysReAllocString来重新分配您现有的BSTR值。
马丁
答案 3 :(得分:0)
如果您的功能定义为:
HRESULT Foo(BSTR input){...}
称之为:
Foo(_bstr_t(L"abc"));