2017-08-31 7 views
0

J'écris le serveur et le client en utilisant le langage de définition d'interface et l'appel de procédure à distance en C++. Je peux envoyer des données du client au serveur avec l'attribut [in]. Maintenant, je veux que le serveur renvoie les données au client. Mais j'ai échoué à recevoir des données correctes.Appel de procédure distante et MIDL: comment implémenter la fonction avec l'attribut [out]?

I définit la fonction dans l'interface .idl comme ci-dessous:

[ 
    //uuid and verison define here 
] 

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

Le document MIDL dit que

Un [out] paramètre -seulement est supposé être non défini lorsque la procédure à distance est appelé et la mémoire de l'objet est allouée par le serveur.

Donc, dans client.cpp, j'instancie la variable et appelle la fonction.

RpcTryExcept{ 
    int *num; 
    sendData(hBinding, 123, num); 
} 

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

J'imprime le tableau int dans le client, et obtenir 3 nombres aléatoires. J'ai également essayé de définir la taille dans le client d'abord. int *num = new int[3]. Cette fois, il peut passer la valeur de numOut [0] au client, mais les autres index sont tous foirés. J'ai essayé le tableau de char aussi bien mais pas bon. Peut-être que j'ai mal compris quelque chose. Quelqu'un peut-il me donner quelques idées? Merci.

Répondre

0

Le code

void sendData(handle_t IDL_handle, int numIn, int *numOut){ 
    numOut = new int[3]; 
    numOut[0] = 1; 
    numOut[1] = 2; 
    numOut[2] = 3;  
} 

ne change la copie de la valeur du paramètre de pointeur et vous laisse avec une fuite de mémoire.

Je soupçonne une mise en œuvre devrait plutôt ressembler à

void sendData(handle_t IDL_handle, int numIn, int *numOut){ 
    *numOut = 42; 
} 

Pour retourner un tableau avec un paramètre [out] la signature serait plutôt ressembler à

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

Vérifiez vos définitions IDL à nouveau.

+0

Merci, cela fonctionne. Maintenant, je suis un peu confus. Lorsque le serveur envoie un tableau int ou un tableau flottant (je lis le fichier dans le tableau float) au client, il fonctionne avec float * ou float [] dans IDL. Mais lorsque le client envoie des données au serveur, il montre un comportement différent. Je vais essayer de comprendre. – tianhuaf