远程过程调用和 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] 属性的功能?的主要内容,如果未能解决你的问题,请参考以下文章

轻松实现远程监控三菱PLC

三步实现西门子PLC远程监控

C ++中的远程过程调用(RPC):当端点被硬编码时,多个客户端可以监听一个服务器吗?

远程RPC调用实现过程

轻松实现手机APP的PLC远程监控

手机怎样实现对PLC的远程监控及调试?