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

发布于 2024-11-13 22:10:37 字数 548 浏览 2 评论 0原文

我正在尝试进行 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();

但任何从客户端调用的尝试都不会产生任何结果返回错误数组边界无效。

从 RPC 调用返回字符串的正确方法是什么?

谢谢, J

I'm trying to make an RPC call which requests 2 numbers and a string from the RPC server, the IDL looks like this:

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

In the server-side call I do this:

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

But any attempt to call from the client-side results in nothing returned the error The array bounds are invalid.

What is the correct way to return a string from an RPC call?

Thanks,
J

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

梦明 2024-11-20 22:10:37

如果您有选择,请使用BSTR(即SysAllocString)。 RPC 了解有关此数据类型的所有信息以及如何复制它并查​​找其长度。

[out, retval] BSTR* pstrName

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

If you have a choice in the matter, use BSTR (i.e. SysAllocString). RPC knows all about this data type and how to copy it and find its length.

Just

[out, retval] BSTR* pstrName

is enough, no separate length parameter needed.

趴在窗边数星星i 2024-11-20 22:10:37

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

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

The server is not able to pass string value back to client since it doesn't know how to marshall the string..

When you use BSTR type, the server knows to the length of the string. BSTR must be preceded by a 4-byte length field and terminated by a single null 2-byte character.

酷到爆炸 2024-11-20 22:10:37

你写的地方:

*nLength = name.length();

我相信你需要

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

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

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

Where you have written:

*nLength = name.length();

I believe you need

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

In particular, if you have an empty (length zero) string, then returning a size_is(0) array is not legal -- so you must add space for the string-terminating NUL (L'\0').

You also want to supply the size in bytes, where each Unicode character uses two bytes -- therefore you must multiply by the character size.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文