6

outC++ COM dll のインターフェイスに 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 を 2 回呼び出すとどうなりますか? これを処理する最善の方法は何ですか?

4

4 に答える 4

9

BSTR実際に「out」パラメーターとして渡すものを除いて、すべての s を処理する必要があります。あなたBSTRが渡したものは解放する必要はありません - 呼び出し元はそれを解放する責任があり、あなたのコードはBSTR割り当てられた可能性のある他のすべての s に対して責任があります。

これらの一時的な sが本当に必要な場合は、またはそれらの一時的なs のBSTRようなラッパー クラスを使用する必要があります(ただし、渡すものには使用しないでください)。あなたが説明した場合、制御パスで複数の作成を必要としないようにコードを書き直す方がはるかに良いと思います。ATL::CComBSTR_bstr_tBSTRBSTR

ここにいくつかの擬似コードがあります:

 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-27T08:28:02.370 に答える
3

Martynが回答したこととは別に、これにはCComBSTRを使用してみてください。これにより、BSTRの割り当てと解放が自動的に処理されます。

ところで、CComBSTRクラスはRAIIの例です

于 2011-05-27T05:46:03.630 に答える
2

SysAllocString を 2 回呼び出すと、最初の BSTR がリークします。これを行うべきではありません。代わりに、最初の BSTR で SysFreeString を使用し、2 番目の BSTR で SysAllocString を使用するか、単に SysReAllocString を呼び出して既存の BSTR 値を再割り当てすることができます。

マーティン

于 2011-05-27T05:25:42.977 に答える
0

次のように定義された関数の場合:

HRESULT Foo(BSTR input){...}

次のように呼び出します。

Foo(_bstr_t(L"abc"));
于 2013-07-24T17:36:07.123 に答える