Compartilhar via


[dentro, fora, 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 [em], 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] estruturar para alocar memória no servidor e, em seguida, usar 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 o [length_is] variável antes de chamar o procedimento remoto.

Em algumas situações, usar parâmetros separados em vez de uma única cadeia de caracteres para entrada e 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, o achInOut da matriz de caracteres também é usado como um parâmetro [fora]. 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 Analisar no servidor deve redefinir o parâmetro pcbSize para indicar o número de elementos que o servidor transmitirá ao cliente, conforme mostrado:

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