COM初心者です。交換することの利点は正確には何ですか:
L"String"
と
CComBSTR(L"String")
すべての文字列がこのように置き換えられた .NET アプリケーションの COM 部分に変更リストが表示されます。これの必要性を知りたいです。
COM初心者です。交換することの利点は正確には何ですか:
L"String"
と
CComBSTR(L"String")
すべての文字列がこのように置き換えられた .NET アプリケーションの COM 部分に変更リストが表示されます。これの必要性を知りたいです。
BSTR
と同じではありませんWCHAR[]
。BSTR
値の前には長さがあり、nullで終了します。
CまたはC++で記述されたインプロセスオブジェクトを処理している場合、C / C ++コードはおそらくBSTRがnullで終了するワイド文字列であると想定するため、通常はこれを回避します。
一方、アウトプロセス/クロスマシンオブジェクトを処理している場合、プロキシ/スタブマーシャリングコードは、実際にBSTRを通過したと想定し、長さフィールドを見つけることを期待します(必要なこれは、マーシャリングするデータの量を知るためです)。これはひどく間違っています。
つまり、何かがBSTRを予期している場合は、SysAllocString(またはCComBSTR、またはCString :: AllocSysString)を呼び出します。
L"Something" を、BSTR を想定していると宣言された COM メソッドに渡すことはできますが、絶対に行わないでください。
規則では、BSTR は SysAllocString() ファミリー関数の 1 つを使用して割り当てられ、BSTR を受け取る人は誰でも、文字列の長さを知りたいときはいつでも SysStringLen() を呼び出すことができます (またそうする必要があります)。SysStringLen() は、SysAllocString() ファミリ関数で割り当てられている BSTR に依存しており (これらの関数によって割り当てられ初期化された追加のデータを使用するため)、その要件に違反すると、プログラムは未定義の動作を実行します。
SysAllocString() を直接使用すると、SysFreeString() を呼び出して文字列を解放する必要があるため (そうしないと、メモリ リークが発生します)、大量のコードが発生し、エラーが発生する可能性があります。より良い方法は、CComBSTR や _bstr_t などのラッパー クラスを使用して BSTR を管理することです。これらは、必要に応じて SysAllocString()/SysFreeString() を呼び出します (もちろん、悪用しない限り)。