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