远程过程调用和 MIDL:如何使用 [out] 属性实现功能?

Remote Procedure Call and MIDL: How to implement function with [out] attribute?

我正在使用 C++ 中的接口定义语言和远程过程调用编写服务器和客户端。我可以使用 [in] 属性将数据从客户端发送到服务器。现在我希望服务器将数据发送回客户端。但是我没有收到正确的数据。

我在.idl接口中定义函数如下:

[
    //uuid and verison define here
]

interface utility{
    void sendData([in] int numIn, [out] int *numOut);
}

MIDL 文档说

An [out]-only parameter is assumed to be undefined when the remote procedure is called and memory for the object is allocated by the server.

所以在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]的值传给client了,但是其他的索引都乱了。我也尝试过 char 数组,但效果不佳。也许我误会了什么。谁能给我一些想法?谢谢。

代码

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;
}

对于 return 带有 [out] 参数的数组,签名更像是

void sendData(handle_t IDL_handle, int numIn, int **numOut);

再次检查您的 IDL 定义。