如何使用BSTR* 我有一个C++的COM DLL中的接口的0){//第一种情况 *结果=SysAllocString(“阳性”); }如果(internalStateValue
例如:如何使用BSTR* 我有一个C++的COM DLL中的接口的0){//第一种情况 *结果=SysAllocString(“阳性”); }如果(internalStateValue,com,bstr,Com,Bstr,例如: 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 ne
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两次会发生什么?处理此问题的最佳方法是什么?如果调用SysAllocString两次,将泄漏第一个BSTR。你不应该这样做。您可以在第一个BSTR上使用SysFreeString,然后在第二个BSTR上使用SysAllocString,或者更简单地调用SysReAllocString来重新分配现有的BSTR值
Martyn除了Martyn的回答之外,您应该尝试使用for,它将自动处理分配和释放BSTR
顺便说一句,CComBSTR类是一个例子,您必须处理所有的
BSTR
s,但实际作为“out”参数传递的除外。您发出的BSTR
不需要释放-调用者负责释放它,您的代码负责它可以分配的所有其他BSTR
s
如果你真的需要那些临时的BSTR
s,你应该为那些临时的BSTR
s使用像ATL::CComBSTR
或\u 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;
}
HRESULT函数(BSTR*结果)
{
如果(结果==0){
返回E_指针;
}
int internalStateValue=getState();
如果(internalStateValue>0){//第一种情况
*结果=SysAllocString(“阳性”);
}如果(internalStateValue<0){//第二种情况
*结果=SysAllocString(“阴性”);
}else{//默认情况
*结果=系统分配字符串(“零”);
}
返回S_OK;
}
如果函数定义为:
HRESULT Foo(BSTR input){...}
可以这样说:
Foo(_bstr_t(L"abc"));