Compartir a través de


[in, out, size_is] Prototipo

El prototipo de función siguiente usa una matriz de caracteres de recuento único que se pasa de ambas maneras: de cliente a servidor y de servidor a cliente:

#define STRSIZE 500 //maximum string length

void Analyze(
    [in, out, length_is(*pcbSize), size_is(STRSIZE)] char  achInOut[],
    [in, out]  long *pcbSize);

Como parámetro [in], achInOut debe apuntar a un almacenamiento válido en el lado cliente. El desarrollador asigna memoria asociada a la matriz en el lado cliente antes de realizar la llamada a procedimiento remoto.

Los códigos auxiliares usan el parámetro [size_is] strsize para asignar memoria en el servidor y, a continuación, usan el parámetro [length_is] pcbSize para transmitir los elementos de matriz a esta memoria. El desarrollador debe asegurarse de que el código de cliente establece la variable [length_is] antes de llamar al procedimiento remoto.

En algunas situaciones, el uso de parámetros independientes en lugar de una sola cadena para la entrada y salida es más eficaz y proporciona flexibilidad. Esto se muestra en el ejemplo siguiente:

/* client */ 
char achInOut[STRSIZE];
long cbSize;
...
gets_s(achInOut, STRSIZE);       // get patient input
cbSize = strlen(achInOut) + 1;   // transmit '\0' too
Analyze(achInOut, &cbSize);

En el ejemplo anterior, la matriz de caracteres achInOut también se usa como parámetro [out]. En C, el nombre de la matriz es equivalente al uso de un puntero. De forma predeterminada, todos los punteros de nivel superior son punteros de referencia: no cambian en el valor y apuntan al mismo área de memoria en el cliente antes y después de la llamada. Toda la memoria a la que accede el procedimiento remoto debe ajustarse al tamaño que el cliente especifica antes de la llamada o los códigos auxiliares generarán una excepción.

Antes de devolver, la función Analyze en el servidor debe restablecer el parámetro pcbSize para indicar el número de elementos que el servidor transmitirá al cliente como se muestra:

/* server */ 
Analyze(char * str, long * pcbSize)
{
   ...
   *pcbSize = strlen(str) + 1; // transmit '\0' too
   return;
}