Share via


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.

nei parametri

out (parametri)

parametri in-out