2017-08-31 36 views
0

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

予定义的.idl接口功能如下:

[ 
    //uuid and verison define here 
] 

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

MIDL文件说,

一个[out]假定-only参数为未定义当远程过程是所谓的对象和内存是由服务器分配的。

所以在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数组,但没有好处。也许我误解了一些东西。任何人都可以给我一些想法吗?谢谢。

回答

0

代码

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定义。

+0

谢谢,它的工作原理。现在我有点困惑。当服务器向客户端发送一个int数组或float数组(我读取文件到float数组)时,它可以在IDL中使用float *或float []。但是,当客户端发送数据到服务器时,它显示不同的行为。我会尽力弄清楚。 – tianhuaf