Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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;
}