2

COM初心者です。交換することの利点は正確には何ですか:

L"String"

CComBSTR(L"String")

すべての文字列がこのように置き換えられた .NET アプリケーションの COM 部分に変更リストが表示されます。これの必要性を知りたいです。

4

2 に答える 2

4

BSTRと同じではありませんWCHAR[]BSTR値の前には長さがあり、nullで終了します。

CまたはC++で記述されたインプロセスオブジェクトを処理している場合、C / C ++コードはおそらくBSTRがnullで終了するワイド文字列であると想定するため、通常はこれを回避します。

一方、アウトプロセス/クロスマシンオブジェクトを処理している場合、プロキシ/スタブマーシャリングコードは、実際にBSTRを通過したと想定し、長さフィールドを見つけることを期待します(必要なこれは、マーシャリングするデータの量を知るためです)。これはひどく間違っています。

つまり、何かがBSTRを予期している場合は、SysAllocString(またはCComBSTR、またはCString :: AllocSysString)を呼び出します。

于 2009-11-17T15:05:35.977 に答える
0

L"Something" を、BSTR を想定していると宣言された COM メソッドに渡すことはできますが、絶対に行わないでください。

規則では、BSTR は SysAllocString() ファミリー関数の 1 つを使用して割り当てられ、BSTR を受け取る人は誰でも、文字列の長さを知りたいときはいつでも SysStringLen() を呼び出すことができます (またそうする必要があります)。SysStringLen() は、SysAllocString() ファミリ関数で割り当てられている BSTR に依存しており (これらの関数によって割り当てられ初期化された追加のデータを使用するため)、その要件に違反すると、プログラムは未定義の動作を実行します。

SysAllocString() を直接使用すると、SysFreeString() を呼び出して文字列を解放する必要があるため (そうしないと、メモリ リークが発生します)、大量のコードが発生し、エラーが発生する可能性があります。より良い方法は、CComBSTR や _bstr_t などのラッパー クラスを使用して BSTR を管理することです。これらは、必要に応じて SysAllocString()/SysFreeString() を呼び出します (もちろん、悪用しない限り)。

于 2009-11-17T06:36:48.177 に答える