本ATLIternalsから、BSTRはOLECHAR *とは異なり、BSTRにはCComBSTRとCStringがあることがわかりました。
BSTRのメモリの割り当てと解放のMSDNによると、呼び出し元/呼び出し先のメモリ管理の責任を知っていました。
MSDNからこの行を取得します。
HRESULT CMyWebBrowser::put_StatusText(BSTR bstr)
私はまだbstr
私の実装で適切に処理する方法を知りません。BSTRについてはまだ基本的な質問があるのでbstr
、少なくともCOMインターフェイスの境界では、値(intなど)または参照(int *など)として扱う必要があります。
実装でBSTRをできるだけ早くCString/CComBSTRに変換したいと思います。値または参照セマンティクスは、変換の場合とはまったく異なります。私はCComBSTR.Attach、CComBSTR.AssignBSTRなどを掘り下げました。しかし、コードは私の疑問を解決することはできません。
MSDN CComBSTR.Attachにはコードの一部がありますが、BSTRのメモリの割り当てと解放に従わないため、間違っていると思います。ATL Internalsによると、SetSysStringは「渡された元のBSTRを解放します」。これを使用すると、CComBSTR.Attachと同様に、BSTR引数の規則に違反します。
全体として、実装で生のBSTRを処理するためにCStringを使用したいのですが、正しい方法がわかりません...プロジェクトでいくつかの作業コードを記述しましたが、私は正しいです。
コーディング言語について話させてください
HRESULT CMyWebBrowser::put_StatusText(BSTR bstr)
{
// What I do NOT know
CString str1; // 1. copy bstr (with embeded NUL)
CString str2; // 2. ref bstr
// What I know
CComBSTR cbstr1;
cbstr1.AssignBSTR(bstr); // 3. copy bstr
CComBSTR cbstr2;
cbstr2.Attach(bstr); // 4. ref bstr, do not copy
// What I do NOT know
// Should we copy or ref bstr ???
}