Attributi direzionali (parametro)
Gli attributi direzionali descrivono se i dati vengono trasmessi dal client al server, dal server al client o da 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 le routine chiamate e chiamate. Quando si esegue la compilazione 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 se applicato ai parametri che non fungono da puntatori perché i parametri della funzione C vengono passati per valore. In C, la funzione chiamata 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 chiamante del client e che la memoria associata al puntatore deve essere restituita in base 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 viene definita nel file IDL come segue:
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 routine chiamante. Anche se l'applicazione server può modificarne il 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 entrambi gli 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 a cui punta ps2 viene restituito al client.
Il terzo parametro è [ soloout]. 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 il terzo parametro. Il primo parametro, [solo in], rimane invariato.