Condividi tramite


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.

nei parametri

parametri out

parametri in uscita