从Win32 RPC调用返回字符串

Return a string from Win32 RPC call

本文关键字:返回 字符串 调用 RPC Win32      更新时间:2023-10-16

我正在尝试进行一个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调用返回字符串的正确方法是什么?

谢谢,J

如果您对此有选择,请使用BSTR(即SysAllocString)。RPC知道关于这种数据类型的所有信息,以及如何复制它并找到它的长度。

只是

[out, retval] BSTR* pstrName

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

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

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

您写的地方:

*nLength = name.length();

我相信你需要

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

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

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