2010-12-03 14 views
6

に* BSTR型のパラメータを渡すために、_bstr_tの使用:これを行うための正しい方法は何ですか機能

_bstr_t description; 
errorInfo->GetDescription(&description.GetBSTR()); 

か:

_bstr_t description; 
errorInfo->GetDescription(description.GetAddress()); 
IError:GetDescriptionは次のように定義されて

HRESULT GetDescription (BSTR *pbstrDescription); 

私は簡単にこれを行うことができます知っている:

BSTR description= SysAllocString (L"Whateva")); 
errorInfo->GetDescription (&description); 
SysFreeString (description); 

おかげ

答えて

8

BSTRは参照カウントされますが、のgetAddressを(使用している場合、私は真剣に疑いそれは正しく動作します)。悲しいことに、ソースコードはそれを再確認できません。 _bstr_tを構築するための適切な方法は、あなたかどうかGetDescriptionリターンにあなたが所有BSTRを依存し、またはあなたドンメモリを参照している1 - @ハンスの答えをフォローアップするために

BSTR temp = 0; 
HRESULT hr = p->GetDescription(&temp); 
if (SUCCEEDED(hr)) { 
    _bstr_t wrap(temp, FALSE); 
    // etc.. 
} 
+0

+1、他のインスタンスで共有されている_bstr_tのBSTRの話はそれに直接割り当てることができます何も私を先送りにします。 –

+1

代入演算子の代わりに 'Attach()'を使うべきではありませんか? –

+0

示すように、関数は 'GetDescription'は' SysAllocString'とtemp' 'にメモリを割り当て、そのメモリが解放されることはありません。どちらかが、あなたは 'SysFreeStringの(一時)'を呼び出す、もしくは 'wrap'は、そのメモリにアタッチし、それを解放することを確認する必要があります。 – abelenky

5

:私はいつもこのようにそれをやりました自由にしなければならない。

ここでの目標は、コピーの数を最小限にするだけでなく、返されたデータにSysFreeStringを手動で呼び出しを避けるためです。これを明確にするために示したように、私はコードを変更します:

BSTR temp = 0; 
HRESULT hr = p->GetDescription(&temp); 
if (SUCCEEDED(hr)) { 
    _bstr_t wrap(temp, false); // do not copy returned BSTR, which 
            // will be freed when wrap goes out of scope. 
            // Use true if you want a copy. 
    // etc.. 
} 
2

のVisual Studioの以前の(またはそれ以降)のバージョンには適用されない場合があります後半の答え。ただし、 VS 12.0はインラインで_bstr_tインラインで実装されており、具体的には_bstr_tGetBSTR()を呼び出すときにm_RefCountが1の内部Data_tインスタンスが作成されます。だからあなたの最初の例では_bstr_tライフサイクルは大丈夫になりそうだ。

_bstr_t description; 
errorInfo->GetDescription(&description.GetBSTR()); 

しかし_bstr_tが汚れている場合は、既存の内部m_wstrポインタは、それが参照され、以前のメモリリーク、上書きされます。

で最初にクリアされている場合は、operator&を使用すると、汚れた_bstr_tを使用できます。過負荷は、GetBSTR()の代わりにアドレス演算子を使用する利便性も提供します。

BSTR *operator&(_bstr_t &b) { 
    b.Assign(nullptr); 
    return &b.GetBSTR(); 
} 

だから、あなたの最初の例では、代わりに次のようになります。

_bstr_t description(L"naughty"); 
errorInfo->GetDescription(&description); 

この評価は、VS 12.0からcomutil.hに基づいていました。

関連する問題