Share via


Attributo transmit_as

L'attributo [transmit_as] offre un modo per controllare il marshalling dei dati senza preoccuparsi del marshalling dei dati a basso livello, ovvero senza preoccuparsi delle dimensioni dei dati o dello scambio di byte in un ambiente eterogeneo. Consentendo di ridurre la quantità di dati trasmessi sulla rete, l'attributo [transmit_as] può rendere l'applicazione più efficiente.

Si usa l'attributo [transmit_as] per specificare un tipo di dati che gli stub RPC trasmetteranno sulla rete anziché usare il tipo di dati fornito dall'applicazione. Vengono fornite routine che converte il tipo di dati in e dal tipo usato per la trasmissione. È anche necessario fornire routine per liberare la memoria utilizzata per il tipo di dati e il tipo trasmesso. Ad esempio, il seguente definisce xmit_type come tipo di dati trasmesso per tutti i dati dell'applicazione specificati come di tipo type_spec:

typedef [transmit_as (xmit_type)] type_spec type;

La tabella seguente descrive i quattro nomi di routine forniti dal programmatore. Il tipo di dati è noto all'applicazione e xmit_type è il tipo di dati usato per la trasmissione.

Routine Descrizione
type_to_xmit Alloca un oggetto del tipo trasmesso e converte dal tipo di applicazione al tipo di applicazione trasmesso tramite la rete (chiamante e oggetto denominato).
Type_from_xmit Converte dal tipo trasmesso al tipo di applicazione (chiamante e oggetto chiamato).
Type_free_inst Libera le risorse usate dal tipo di applicazione (oggetto denominato solo).
Type_free_xmit Libera l'archiviazione restituita dalla routine type*__*to_xmit (chiamante e oggetto denominato).

 

Oltre a queste quattro funzioni fornite dal programmatore, il tipo trasmesso non viene modificato dall'applicazione. Il tipo trasmesso viene definito solo per spostare i dati sulla rete. Dopo la conversione dei dati nel tipo utilizzato dall'applicazione, la memoria utilizzata dal tipo trasmesso viene liberata.

Queste routine fornite dal programmatore vengono fornite dal client o dall'applicazione server in base agli attributi direzionali. Se il parametro è [in] solo, il client trasmette al server. Il client necessita delle funzioni di type_to_xmit e type_free_xmit . Il server necessita delle funzioni type_from_xmit e type_free_inst . Per un parametro [out]only, il server trasmette al client. L'applicazione server deve implementare le funzioni type_to_xmit e type_free_xmit , mentre il programma client deve fornire la funzione di type_from_xmit . Per gli oggetti xmit_type temporanei, lo stub chiamerà type*_*free_xmit per liberare qualsiasi memoria allocata da una chiamata a type_to_xmit.

Alcune linee guida si applicano all'istanza del tipo di applicazione. Se il tipo di applicazione è un puntatore o contiene un puntatore, la routine type_from_xmit deve allocare memoria per i dati a cui puntano i puntatori (l'oggetto tipo di applicazione stesso viene modificato dallo stub nel modo consueto).

Per i parametri [out] e [in, out] o uno dei relativi componenti, di un tipo che contiene l'attributo [transmit_as] , la routine type_free_inst viene chiamata automaticamente per gli oggetti dati con l'attributo . Per nei parametri, la routine type_free_inst viene chiamata solo se l'attributo [transmit_as] è stato applicato al parametro. Se l'attributo è stato applicato ai componenti del parametro, la routine type_free_inst non viene chiamata. Non sono presenti chiamate gratuite per i dati incorporati e una chiamata alla maggior parte (correlata all'attributo di primo livello) per un solo parametro.

A partire da MIDL 2.0, sia client che server devono fornire tutte e quattro le funzioni. Ad esempio, un elenco collegato può essere trasmesso come matrice di dimensioni. La routine type_to_xmit illustra l'elenco collegato e copia i dati ordinati in una matrice. Gli elementi della matrice vengono ordinati in modo che i puntatori associati alla struttura dell'elenco non devono essere trasmessi. La routine type_from_xmit legge la matrice e inserisce i relativi elementi in una struttura di elenco collegato.

L'elenco collegato doppio (DOUBLE_LINK_LIST) include i dati e i puntatori agli elementi dell'elenco precedente e successivo:

typedef struct _DOUBLE_LINK_LIST 
{
    short sNumber;
    struct _DOUBLE_LINK_LIST * pNext;
    struct _DOUBLE_LINK_LIST * pPrevious;
} DOUBLE_LINK_LIST;

Anziché inviare la struttura complessa, l'attributo [transmit_as] può essere usato per inviarlo tramite la rete come matrice. La sequenza di elementi nella matrice mantiene l'ordinamento degli elementi nell'elenco a un costo inferiore:

typedef struct _DOUBLE_XMIT_TYPE 
{
    short sSize;
    [size_is(sSize)] short asNumber[];
} DOUBLE_XMIT_TYPE;

L'attributo [transmit_as] viene visualizzato nel file IDL:

typedef [transmit_as(DOUBLE_XMIT_TYPE)]  DOUBLE_LINK_LIST DOUBLE_LINK_TYPE;

Nell'esempio seguente , ModifyListProc definisce il parametro di tipo DOUBLE_LINK_TYPE come parametro [in, out] :

void ModifyListProc([in, out] DOUBLE_LINK_TYPE * pHead)

Le quattro funzioni definite dal programmatore usano il nome del tipo nei nomi delle funzioni e usano i tipi presentati e trasmessi come tipi di parametri, come richiesto:

void __RPC_USER DOUBLE_LINK_TYPE_to_xmit ( 
    DOUBLE_LINK_TYPE __RPC_FAR * pList, 
    DOUBLE_XMIT_TYPE __RPC_FAR * __RPC_FAR * ppArray);

void __RPC_USER DOUBLE_LINK_TYPE_from_xmit ( 
    DOUBLE_XMIT_TYPE __RPC_FAR * pArray,
    DOUBLE_LINK_TYPE __RPC_FAR * pList);

void __RPC_USER DOUBLE_LINK_TYPE_free_inst ( 
    DOUBLE_LINK_TYPE __RPC_FAR * pList);

void __RPC_USER DOUBLE_LINK_TYPE_free_xmit ( 
    DOUBLE_XMIT_TYPE __RPC_FAR * pArray);