我正在尝试进行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调用返回字符串的正确方法是什么?
谢谢, Ĵ
答案 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字符使用两个字节 - 因此您必须乘以字符大小。