[in, out, size_is] 프로토 타입

다음 함수 프로토타입은 클라이언트에서 서버로, 서버에서 클라이언트로 두 가지 방법으로 전달되는 단일 개수 문자 배열을 사용합니다.

#define STRSIZE 500 //maximum string length

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

[in] 매개 변수인 achInOut은 클라이언트 쪽의 유효한 스토리지를 가리킵니다. 개발자는 원격 프로시저 호출을 하기 전에 클라이언트 쪽에서 배열과 연결된 메모리를 할당합니다.

스텁은 [size_is] 매개 변수 strsize 를 사용하여 서버에 메모리를 할당한 다음 [length_is] 매개 변수 pcbSize 를 사용하여 배열 요소를 이 메모리로 전송합니다. 개발자는 원격 프로시저를 호출하기 전에 클라이언트 코드가 [length_is] 변수를 설정하는지 확인해야 합니다.

경우에 따라 입력 및 출력에 단일 문자열 대신 별도의 매개 변수를 사용하는 것이 더 효율적이며 유연성을 제공합니다. 다음 예제에서 설명합니다.

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

이전 예제에서 문자 배열 achInOut도 [out] 매개 변수로 사용됩니다. C에서 배열의 이름은 포인터를 사용하는 것과 같습니다. 기본적으로 모든 최상위 포인터는 참조 포인터이며, 값이 변경되지 않으며 호출 전후에 클라이언트의 동일한 메모리 영역을 가리킵니다. 원격 프로시저가 액세스하는 모든 메모리는 호출 전에 클라이언트가 지정하는 크기에 맞거나 스텁이 예외를 생성합니다.

반환하기 전에 서버의 Analyze 함수는 pcbSize 매개 변수를 다시 설정하여 다음과 같이 서버가 클라이언트에 전송할 요소 수를 나타내야 합니다.

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