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
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
実数BSTR
は次のとおりです。
SysAllocString()
およびファミリを介して)ドキュメントを参照してください: MSDN: BSTR
を受け入れるほとんどの関数BSTR
は、単純な代入を作成した BSTR が渡されたときにクラッシュしません。BSTR
これは、 aが any と同じように初期化できると推測する作業コードのように見えるものを人々が観察するときに混乱を招きますWCHAR *
。その推論は正しくありません。
BSTRs
OLE オートメーション インターフェイスに渡すことができるのはreal だけです。
CComBSTR()
を呼び出すコンストラクタを使用することSysAllocString()
で、コードは実数の を作成しますBSTR
。デストラクタはCComBSTR()
、割り当てられたストレージを を介してシステムに返しSysFreeString()
ます。
CComBSTR()
所有権を取得する API に を渡す場合は、必ず.Detach()
メソッドを呼び出して、BSTR
が解放されないようにしてください。 BSTRs
は(COM オブジェクトとは異なり) 参照カウントされないBSTR
ため、 2 回以上解放しようとするとクラッシュします。
CComBSTR
個人的には、新しいオブジェクトを構築する必要がないため、オプション 1 を好みます。(もちろん、彼らのコードが舞台裏でそうするかどうかは別の話です。)
オプション 1 が推奨されるのは、オプション 2 が 2 を行うのに対し、文字列の割り当てを 1 つだけ行うためです (特別な理由なしに新しい一時オブジェクトが作成されるにもかかわらず)。VC++ の bstr_t 型とは異なり、ATL 型はカウントされた文字列の参照を行わないため、文字列全体をコピーします。