1

I'm confused about COM string assignments. Which of the following string assignment is correct. Why?

CComBSTR str;
.
.
Obj->str = L""  //Option1

OR should it be

Obj->str = CComBSTR(L"")  //Option2

What is the reason

4

4 に答える 4

4

実数BSTRは次のとおりです。

  • COM ヒープから一時的に割り当てられます (SysAllocString()およびファミリを介して)
  • 文字列データの前にその長さがあり、32 ビット値で格納されるデータ構造。
  • 文字列データが存在するデータ構造の 5 番目のバイトへのポインターとして渡されます。

ドキュメントを参照してください: MSDN: BSTR

を受け入れるほとんどの関数BSTRは、単純な代入を作成した BSTR が渡されたときにクラッシュしません。BSTRこれは、 aが any と同じように初期化できると推測する作業コードのように見えるものを人々が観察するときに混乱を招きますWCHAR *。その推論は正しくありません。

BSTRsOLE オートメーション インターフェイスに渡すことができるのはreal だけです。

CComBSTR()を呼び出すコンストラクタを使用することSysAllocString()で、コードは実数の を作成しますBSTR。デストラクタはCComBSTR()、割り当てられたストレージを を介してシステムに返しSysFreeString()ます。

CComBSTR()所有権を取得する API に を渡す場合は、必ず.Detach()メソッドを呼び出して、BSTRが解放されないようにしてください。 BSTRsは(COM オブジェクトとは異なり) 参照カウントされないBSTRため、 2 回以上解放しようとするとクラッシュします。

于 2009-11-16T23:27:08.153 に答える
3

使用するstr = CComBSTR(L"")場合は、コンストラクターを使用します。

CComBSTR( LPCSTR pSrc );

使用するstr = L""場合は、代入演算子を使用します。

CComBSTR& operator =(LPCSTR pSrc);

どちらも CComBSTR オブジェクトを正しく初期化します。

于 2009-11-16T23:03:38.637 に答える
1

CComBSTR個人的には、新しいオブジェクトを構築する必要がないため、オプション 1 を好みます。(もちろん、彼らのコードが舞台裏でそうするかどうかは別の話です。)

于 2009-11-16T23:02:55.253 に答える
1

オプション 1 が推奨されるのは、オプション 2 が 2 を行うのに対し、文字列の割り当てを 1 つだけ行うためです (特別な理由なしに新しい一時オブジェクトが作成されるにもかかわらず)。VC++ の bstr_t 型とは異なり、ATL 型はカウントされた文字列の参照を行わないため、文字列全体をコピーします。

于 2009-11-16T23:05:42.450 に答える