如何使用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"));