Condividi tramite


[in, out, size_is] Prototipo

Il prototipo di funzione seguente usa una matrice di caratteri con conteggio singolo che viene passata in entrambi i modi: dal client al server e dal server al client:

#define STRSIZE 500 //maximum string length

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

Come parametro [in], achInOut deve puntare all'archiviazione valida sul lato client. Lo sviluppatore alloca la memoria associata alla matrice sul lato client prima di effettuare la chiamata alla procedura remota.

Gli stub usano il parametro [size_is] strsize per allocare memoria nel server e quindi usare il parametro [length_is] pcbSize per trasmettere gli elementi della matrice in questa memoria. Lo sviluppatore deve assicurarsi che il codice client imposta la variabile [length_is] prima di chiamare la procedura remota.

In alcune situazioni, l'uso di parametri separati anziché una singola stringa per l'input e l'output sono più efficienti e offrono flessibilità. Questo è illustrato nell'esempio successivo:

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

Nell'esempio precedente viene usata anche la matrice di caratteri achInOut come parametro [out]. In C il nome della matrice equivale all'uso di un puntatore. Per impostazione predefinita, tutti i puntatori di primo livello sono puntatori di riferimento, non cambiano il valore e puntano alla stessa area di memoria nel client prima e dopo la chiamata. Tutte le memoria a cui accede la routine remota devono corrispondere alle dimensioni specificate dal client prima della chiamata oppure gli stub genereranno un'eccezione.

Prima di restituire, la funzione Analizza nel server deve reimpostare il parametro pcbSize per indicare il numero di elementi che il server trasmetterà al client, come illustrato di seguito:

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