【发布时间】:2009-05-13 11:47:06
【问题描述】:
我有一个带有以下方法定义(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+ 调用此方法时,缓冲区内容会丢失。具体来说,仅保留第一个宽字符 - 如果服务器复制“Sample”宽字符串,则客户端仅接收“S”字符串。客户端大小的返回值为S_OK,返回给客户端的缓冲区长度与服务器复制的完全相同。
我终于改用 BSTR 来解决这个问题,但有趣的是为什么整个看起来有效的构造不起作用。
所描述行为的可能原因是什么?
【问题讨论】:
标签: windows com interop marshalling