Partilhar via


O atributo wire_marshal

O atributo [ wire_marshal] é um atributo do tipo IDL semelhante em sintaxe a [ transmit_as], mas fornecendo uma maneira mais eficiente de organizar dados em uma rede.

Use o atributo [wire_marshal] para especificar um tipo de dados que será transmitido no lugar do tipo de dados específico do aplicativo. Cada tipo específico de aplicação tem um tipo transmissível correspondente que define a representação de fio (a representação usada na rede). O tipo específico do aplicativo não precisa ser transmissível, mas deve ser um tipo que o MIDL reconheça. Para organizar um tipo desconhecido para MIDL, use o atributo ACF [ user_marshal].

Seu tipo específico de aplicativo pode ser um tipo simples, composto ou de ponteiro. A principal restrição é que a instância de tipo deve ter um tamanho de memória fixo e bem definido. Se o tamanho da instância de tipo precisar ser alterado, use um campo de ponteiro em vez de uma matriz conforme. Como alternativa, você pode definir um ponteiro para o tipo mutável.

Você deve fornecer as rotinas para dimensionar, empacotar e desempacotar os dados, bem como liberar a memória associada. A tabela a seguir descreve os quatro nomes de rotina fornecidos pelo usuário. O tipo <> é o userm-type especificado na definição de tipo [wire_marshal].

Rotina Descrição
<tipo>_UserSize Dimensiona o buffer de dados RPC antes de empacotar no lado do cliente ou servidor.
<tipo>_UserMarshal Marshals os dados no lado do cliente ou servidor.
<tipo>_UserUnmarshal Desmarshals os dados no lado do cliente ou servidor.
<tipo>_UserFree Libera os dados no lado do servidor.

 

Essas rotinas fornecidas pelo programador são fornecidas pelo aplicativo cliente ou servidor com base nos atributos direcionais.

Se o parâmetro for apenas [ in], o cliente transmite para o servidor. O cliente precisa do tipo <>_UserSize e <tipo>_UserMarshal funções. O servidor precisa do tipo <>_UserUnmarshale <tipo>_UserFree funções.

Para um parâmetro [ out]-only, o servidor transmite para o cliente. O servidor precisa do tipo <>_UserSize e <tipo>_UserMarshal funções, enquanto o cliente precisa do tipo <>_UserMarshal função.

O atributo user_marshal

Regras de Marshaling para user_marshal e wire_marshal

wire_marshal

user_marshal

NdrGetUserMarshalInfo