gpt4 book ai didi

c++ - 如何将可变长度字符串从 RPC 服务器传递到客户端?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:30:59 35 4
gpt4 key购买 nike

我正在实现一个 Windows 系统服务,它充当 RPC 服务器和一个相应的客户端,两者都是用 C++ 编写的。我正在使用普通的 Windows RPC 功能。

将字符串从 RPC 客户端传递到服务器很容易。只需像这样在 IDL 文件中声明函数参数:

[in, string] wchar_t* myString

MIDL 将处理内存分配魔法。就像款待一样。

返回修改后的客户端字符串也很容易:

[in, out, string] wchar_t* myString

不过,这需要我在客户端正确调整字符串的大小。

问题:

我需要从服务器返回字符串给客户端。我不知道在客户端上它们会有多大,所以在客户端上分配内存不是一个选项。

可以分配非常大量的内存,比如 10K,这个数量足以容纳服务器可能返回的每个字符串。但这是对资源(内存、网络)的巨大浪费,而且我仍然无法确定服务器永远不需要返回更大的字符串。

我尝试了什么:

除此之外,我还尝试了 Microsoft 的 strout 中使用的技术。样本。第一次调用RPC函数时有效,第二次调用时服务器崩溃。

最佳答案

MSDN 页面 Multiple Levels of Pointers让我走上正轨。通过那里给出的例子和解释,我设法让它发挥作用。主要部分如下:

IDL 文件:

error_status_t ReturnsString
(
[out] long* size,
[out, size_is(, *size)] wchar_t** outString
);

服务器函数:

error_status_t ReturnsString (long* size, wchar_t** outString)
{
wstring outStringWString = L"Return this to caller";

int stringSize = sizeof(wchar_t) * (outStringWString.size() + 1);
*outString = (wchar_t*) midl_user_allocate (stringSize * 2);
wcscpy_s (*outString, stringSize, outStringWString.c_str());

*size = outStringWString.size() + 1;

return ERROR_SUCCESS;
}

我不知道为什么需要乘以 2 (stringSize * 2),但确实如此。如果省略,您会立即发生堆损坏。

客户端代码:

wchar_t** versionRPC = (wchar_t**) midl_user_allocate (sizeof(wchar_t*));
*versionRPC = NULL; // Required to create a unique pointer
long stringSize = 0;
DWORD retVal = ReturnsString (&stringSize, versionRPC);

// Copy the returned string
wstring stringFromServer (*rpcString);

MIDL_user_free (*rpcString);
MIDL_user_free (rpcString);

关于c++ - 如何将可变长度字符串从 RPC 服务器传递到客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10267050/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com