2017-08-31 120 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