Freigeben über


[in, out, size_is] Prototyp

Der folgende Funktionsprototyp verwendet ein Einzählungszeichenarray, das beide Arten übergeben wird: von Client zu Server und vom Server zum 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 gültigen Speicher auf der Clientseite verweisen. Der Entwickler weist dem Array auf clientseitiger Seite zugeordneten Speicher zu, bevor der Remoteprozeduraufruf ausgeführt wird.

Die Stubs verwenden den Parameter [size_is] strsize, um Arbeitsspeicher auf dem Server zuzuweisen, und verwenden Sie dann den Parameter [length_is] pcbSize, um die Arrayelemente in diesen Speicher zu übertragen. Der Entwickler muss sicherstellen, dass der Clientcode die [length_is] Variable festlegt, bevor die Remoteprozedur aufgerufen wird.

In einigen Fällen 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 auf oberster Ebene Referenzzeiger – sie ändern sich nicht in 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, oder die Stubs generieren eine Ausnahme.

Vor dem Zurückgeben muss die Analysefunktion auf dem Server den pcbSize Parameter zurücksetzen, um die Anzahl der Elemente anzugeben, die der Server an den Client überträgt, wie gezeigt:

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