从Win32 RPC调用返回一个字符串

时间:2011-06-06 18:30:09

标签: c++ windows winapi rpc

我正在尝试进行RPC调用,从RPC服务器请求2个数字和一个字符串,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调用返回字符串的正确方法是什么?

谢谢, Ĵ

3 个答案:

答案 0 :(得分:0)

如果您可以选择此问题,请使用BSTR(即SysAllocString)。 RPC知道这种数据类型以及如何复制它并找到它的长度。

只需

[out, retval] BSTR* pstrName

就足够了,不需要单独的长度参数。

答案 1 :(得分:0)

服务器无法将字符串值传递回客户端,因为它不知道如何编组字符串..

当您使用BSTR类型时,服务器知道字符串的长度。 BSTR必须以4字节长度字段开头,并以单个空2字节字符结束。

答案 2 :(得分:-1)

你写的地方:

*nLength = name.length();

我相信你需要

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

特别是,如果您有一个空(长度为零)字符串,则返回size_is(0)数组是不合法的 - 因此您必须为字符串终止NUL(L'\0')添加空间。

您还希望提供以字节为单位的大小,其中每个Unicode字符使用两个字节 - 因此您必须乘以字符大小。