Attributi direzionali (parametro)
Gli attributi direzionali descrivono se i dati vengono trasmessi dal client al server, dal server al client o entrambi. Tutti i parametri nel prototipo di funzione devono essere associati agli attributi direzionali. Le tre possibili combinazioni di attributi direzionali sono: 1) [in], 2) [out]e 3) [in, out]. Questi descrivono il modo in cui i parametri vengono passati tra chiamate e procedure chiamate. Quando si compila nella modalità predefinita (modalità estesa da Microsoft) e si omette un attributo direzionale per un parametro, il compilatore MIDL presuppone un valore predefinito [in].
Un parametro [out] deve essere un puntatore. In effetti, l'attributo [out] non è significativo quando viene applicato ai parametri che non fungono da puntatori perché i parametri della funzione C vengono passati per valore. In C la funzione denominata riceve una copia privata del valore del parametro; non può modificare il valore della funzione chiamante per tale parametro. Se il parametro funge da puntatore, tuttavia, può essere usato per accedere e modificare la memoria. L'attributo [out] indica che la funzione server deve restituire il valore alla funzione di chiamata del client e che la memoria associata al puntatore deve essere restituita in conformità agli attributi assegnati al puntatore.
L'interfaccia seguente illustra le tre possibili combinazioni di attributi direzionali che possono essere applicati a un parametro. La funzione InOutProc è definita nel file IDL come:
void InOutProc ([in] short s1,
[in, out] short * ps2,
[out] float * pf3);
Il primo parametro, s1, è solo [in] . Il valore viene trasmesso al computer remoto, ma non viene restituito alla procedura chiamante. Anche se l'applicazione server può modificare il relativo valore per s1, il valore di s1 nel client è lo stesso prima e dopo la chiamata.
Il secondo parametro, ps2, è definito nel prototipo di funzione come puntatore con attributi [in] e [out]. L'attributo [in] indica che il valore del parametro viene passato dal client al server. L'attributo [out] indica che il valore indicato da ps2 viene restituito al client.
Il terzo parametro è solo [out]. Lo spazio viene allocato per il parametro nel server, ma il valore non è definito nella voce. Come accennato in precedenza, tutti i parametri [out] devono essere puntatori.
La procedura remota modifica il valore di tutti e tre i parametri, ma solo i nuovi valori dei parametri [out] e [in] sono disponibili per il client.
#define MAX 257
void InOutProc(short s1,
short * ps2,
float * pf3)
{
*pf3 = (float) s1 / (float) *ps2;
*ps2 = (short) MAX - s1;
s1++; // in only; not changed on the client side
return;
}
Al ritorno dalla chiamata a InOutProc, vengono modificati i secondi e i terzi parametri. Il primo parametro, che è solo [in] è invariato.