次のメソッド定義(IDL表記)を持つCOMインターフェイスがあります。
SCODE GetText( [in, out] ULONG* pcwcBuffer,
[out, size_is(*pcwcBuffer)] WCHAR* awcBuffer );
TypelibマーシャリングはCOM+に使用され、タイプライブラリが登録され、COM +を介して呼び出された場合、インターフェイスの他のメソッドは正常に機能しますが、このメソッドは機能しません。
サーバー側は、WCHARの配列をにコピーし、awcBuffer
その長さをにコピーしpwcBuffer
ます。バッファオーバーランは発生しません。
static const wchar_t* Text = L"Sample";
STDMETHODIMP CImpl::GetText( ULONG* bufferLength, WCHAR* buffer )
{
const int length = wcslen( Text );
*bufferLength = length;
memcpy( buffer, Text, length * sizeof( WCHAR ) );
return S_OK;
}
クライアントがCOM+を介してこのメソッドを呼び出すと、バッファーの内容が失われます。具体的には、最初のワイド文字のみが保持されます。サーバーが「サンプル」ワイド文字列をコピーする場合、クライアントは「S」文字列のみを受け取ります。クライアントサイズの戻り値はS_OKであり、クライアントに返されるバッファの長さは、サーバーがコピーしたものとまったく同じです。
私はついにこの問題を回避するためにBSTRに切り替えましたが、有効な外観の構成全体が機能しない理由は非常に興味深いものです。
説明されている動作の考えられる理由は何ですか?