out对于C++ COM dll中的接口,我有一个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);
}
}
Run Code Online (Sandbox Code Playgroud)
如果我将SysAllocSTring两次调用到相同的BSTR会怎样?处理这个问题的最佳方法是什么?
BSTR除了实际传递的那个之外,您必须处理所有s作为"out"参数.在BSTR你传递出不需要被释放-主叫方变为负责释放它,你的代码是负责所有其他BSTR的IT可能分配.
如果你真的需要那些临时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;
}
Run Code Online (Sandbox Code Playgroud)
如果调用 SysAllocString 两次,则会泄漏第一个 BSTR。你不应该这样做。您可以在第一个 BSTR 上替换 SysFreeString,然后在第二个 BSTR 上替换 SysAllocString,或者更简单地调用 SysReAllocString 来重新分配现有的 BSTR 值。
马丁