У меня есть интерфейс COM со следующим определением метода (нотация IDL):
SCODE GetText( [in, out] ULONG* pcwcBuffer,
[out, size_is(*pcwcBuffer)] WCHAR* awcBuffer );
Маршалинг библиотеки типов используется для 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, чтобы обойти эту проблему, но действительно интересно, почему не работает вся действующая конструкция.
Какова возможная причина описанного поведения?