Вернуть строку из вызова Win32 RPC - PullRequest
0 голосов
/ 06 июня 2011

Я пытаюсь сделать вызов RPC, который запрашивает 2 номера и строку с сервера RPC, IDL выглядит так:

void GetCurrentStatus([in] handle_t hBinding, [out, ref] DWORD *dwRef1, [out, ref] DWORD *dwRef2, UINT *nLength, [out, size_is(, *nLength)] LPWSTR *pszName);

При вызове на стороне сервера я делаю это:

// name = std::wstring
*pszName = (wchar_t*)midl_user_allocate(name.length()+1 * sizeof(wchar_t));
_tcscpy(*pszName, name.c_str());
*nLength = name.length();

Но любая попытка вызова со стороны клиента ничего не дает, возвращает ошибку The array bounds are invalid.

Как правильно вернуть строку из вызова RPC?

Спасибо, J

Ответы [ 3 ]

0 голосов
/ 06 июня 2011

Где вы написали:

*nLength = name.length();

Я полагаю, вам нужно

*nLength = (name.length() + 1) * sizeof(WCHAR);

В частности, если у вас есть пустая (длина ноль) строка, то возвращается size_is(0)Массив недопустим - поэтому вы должны добавить пространство для завершающего строку NUL (L'\0').

Вы также хотите указать размер в байтах, где каждый символ Unicode использует два байта - поэтому вы должны умножиться на размер символа.

0 голосов
/ 06 июня 2011

Сервер не может передать строковое значение клиенту, так как он не знает, как упорядочить строку ..

Когда вы используете тип BSTR, сервер знает длину строки. BSTR должен предшествовать 4-байтовое поле длины и заканчиваться одним нулевым 2-байтовым символом.

0 голосов
/ 06 июня 2011

Если у вас есть выбор, используйте BSTR (то есть SysAllocString).RPC знает все об этом типе данных и о том, как его скопировать и найти его длину.

Достаточно

[out, retval] BSTR* pstrName

, отдельного параметра длины не требуется.

...