远程过程调用和 MIDL:如何实现具有 [out] 属性的功能?
Posted
技术标签:
【中文标题】远程过程调用和 MIDL:如何实现具有 [out] 属性的功能?【英文标题】:Remote Procedure Call and MIDL: How to implement function with [out] attribute? 【发布时间】:2017-08-31 17:02:25 【问题描述】:我正在使用 C++ 中的接口定义语言和远程过程调用来编写服务器和客户端。我可以使用 [in] 属性将数据从客户端发送到服务器。现在我希望服务器将数据发送回客户端。但我未能收到正确的数据。
我在.idl接口中定义的函数如下:
[
//uuid and verison define here
]
interface utility
void sendData([in] int numIn, [out] int *numOut);
MIDL 文件说
当调用远程过程并且服务器为对象分配内存时,假定未定义仅 [out] 参数。
所以在client.cpp中,我实例化变量并调用函数。
RpcTryExcept
int *num;
sendData(hBinding, 123, num);
在 server.cpp 中,
void sendData(handle_t IDL_handle, int numIn, int *numOut)
numOut = new int[3];
numOut[0] = 1;
numOut[1] = 2;
numOut[2] = 3;
我在客户端打印了 int 数组,得到了 3 个随机数。我还尝试先在客户端定义大小。
int *num = new int[3]
。这次它可以将 numOut[0] 的值传递给客户端,但是其他索引都搞砸了。我也尝试过 char 数组,但效果不佳。也许我误解了什么。谁能给我一些想法?谢谢。
【问题讨论】:
【参考方案1】:代码
void sendData(handle_t IDL_handle, int numIn, int *numOut)
numOut = new int[3];
numOut[0] = 1;
numOut[1] = 2;
numOut[2] = 3;
仅更改指针参数的值副本,并导致内存泄漏。
我怀疑实现应该看起来像
void sendData(handle_t IDL_handle, int numIn, int *numOut)
*numOut = 42;
要返回一个带有[out]
参数的数组,签名应该看起来像
void sendData(handle_t IDL_handle, int numIn, int **numOut);
再次检查您的 IDL 定义。
【讨论】:
谢谢,它有效。现在我有点困惑。当服务器向客户端发送一个 int 数组或 float 数组(我将文件读入 float 数组)时,它可以与 IDL 中的 float * 或 float[] 一起使用。但是当客户端向服务器发送数据时,它会表现出不同的行为。我会努力弄清楚的。以上是关于远程过程调用和 MIDL:如何实现具有 [out] 属性的功能?的主要内容,如果未能解决你的问题,请参考以下文章