Compartilhar via


[entrada, saída, size_is] Protótipo

O protótipo de função a seguir usa uma matriz de caracteres de contagem única que é passada das duas maneiras: de cliente para servidor e de servidor para cliente:

#define STRSIZE 500 //maximum string length

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

Como um parâmetro [in], achInOut deve apontar para um armazenamento válido no lado do cliente. O desenvolvedor aloca memória associada à matriz no lado do cliente antes de fazer a chamada de procedimento remoto.

Os stubs usam o parâmetro [size_is] strsize para alocar memória no servidor e, em seguida, usam o parâmetro [length_is] pcbSize para transmitir os elementos da matriz para essa memória. O desenvolvedor deve verificar se o código do cliente define a variável [length_is] antes de chamar o procedimento remoto.

Em algumas situações, o uso de parâmetros separados em vez de uma única cadeia de caracteres para a entrada e a saída é mais eficiente e fornece flexibilidade. Isso é demonstrado no próximo exemplo:

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

No exemplo anterior, a matriz de caracteres achInOut também é usada como um parâmetro [out]. Em C, o nome da matriz é equivalente ao uso de um ponteiro. Por padrão, todos os ponteiros de nível superior são ponteiros de referência — eles não mudam de valor e apontam para a mesma área de memória no cliente antes e depois da chamada. Toda a memória acessada pelo procedimento remoto deve se ajustar ao tamanho especificado pelo cliente antes da chamada ou os stubs gerarão uma exceção.

Antes de retornar, a função Analyze no servidor deve redefinir o parâmetro pcbSize para indicar o número de elementos que o servidor transmitirá para o cliente, conforme mostrado:

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