对于C++ COM dll中的接口,我的out值为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两次,会发生什么情况?处理这个问题的最好方法是什么?
发布于 2011-05-27 16:28:02
除了实际作为“BSTR”参数传递的参数之外,您必须处理所有的输出。您传递的BSTR不需要被释放-调用者负责释放它,而您的代码负责它可以分配的所有其他BSTR。
如果您真的需要这些临时BSTR,那么您应该对这些临时BSTR使用像ATL::CComBSTR或_bstr_t这样的包装类(但不是对于您传出的那个)。我猜,在您描述的情况下,只需以这样的方式重写代码会更好,这样您就不需要在任何控制路径上创建多个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;
}发布于 2011-05-27 13:46:04
除了Martyn已经回答的问题之外,您应该尝试使用CComBSTR,它将自动处理分配和释放BSTR。
顺便说一句,CComBSTR类是RAII的一个例子
发布于 2011-05-27 13:25:43
如果调用SysAllocString两次,就会泄漏第一个BSTR。您不应该这样做。您可以在第一个BSTR上执行SysFreeString,然后在第二个BSTR上执行SysAllocString,或者更简单地调用SysReAllocString来重新分配现有的BSTR值。
马丁
https://stackoverflow.com/questions/6148068
复制相似问题