[in, out, size_is] Prototyp
Der folgende Funktionsprototyp verwendet ein einzähliges Zeichenarray, das beide Arten übergeben wird: von Client zu Server und von Server zu Client:
#define STRSIZE 500 //maximum string length
void Analyze(
[in, out, length_is(*pcbSize), size_is(STRSIZE)] char achInOut[],
[in, out] long *pcbSize);
Als [in]-Parameter muss achInOut auf einen gültigen Speicher auf der Clientseite verweisen. Der Entwickler weist vor dem Aufruf der Remoteprozedur Arbeitsspeicher zu, der dem Array auf der Clientseite zugeordnet ist.
Die Stubs verwenden den [size_is]-Parameter strsize , um Arbeitsspeicher auf dem Server zuzuweisen, und verwenden dann den [length_is] Parameter pcbSize , um die Arrayelemente in diesen Speicher zu übertragen. Der Entwickler muss sicherstellen, dass der Clientcode die Variable [length_is] festlegt, bevor die Remoteprozedur aufgerufen wird.
In einigen Situationen ist die Verwendung separater Parameter anstelle einer einzelnen Zeichenfolge für die Eingabe und Ausgabe effizienter und bietet Flexibilität. Dies wird im nächsten Beispiel veranschaulicht:
/* client */
char achInOut[STRSIZE];
long cbSize;
...
gets_s(achInOut, STRSIZE); // get patient input
cbSize = strlen(achInOut) + 1; // transmit '\0' too
Analyze(achInOut, &cbSize);
Im vorherigen Beispiel wird das Zeichenarray achInOut auch als [out]-Parameter verwendet. In C entspricht der Name des Arrays der Verwendung eines Zeigers. Standardmäßig sind alle Zeiger der obersten Ebene Verweiszeiger – sie ändern sich nicht im Wert und zeigen auf denselben Speicherbereich auf dem Client vor und nach dem Aufruf. Der gesamte Arbeitsspeicher, auf den die Remoteprozedur zugreift, muss der Größe entsprechen, die der Client vor dem Aufruf angibt, sonst generieren die Stubs eine Ausnahme.
Vor der Rückgabe muss die Analyze-Funktion auf dem Server den parameter pcbSize zurücksetzen, um die Anzahl der Elemente anzugeben, die der Server wie folgt an den Client sendet:
/* server */
Analyze(char * str, long * pcbSize)
{
...
*pcbSize = strlen(str) + 1; // transmit '\0' too
return;
}