O atributo wire_marshal

O atributo [ wire_marshal] é um atributo do tipo IDL semelhante na sintaxe a [ transmit_as], mas fornecendo uma maneira mais eficiente de realizar marshaling de 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 do aplicativo tem um tipo transmitível correspondente que define a representação de transmissão (a representação usada na rede). O tipo específico do aplicativo não precisa ser transmitível, mas deve ser um tipo reconhecido por MIDL. Para realizar marshaling de um tipo desconhecido para MIDL, use o atributo ACF [ user_marshal].

O tipo específico do aplicativo pode ser um tipo simples, composto ou ponteiro. A restrição main é 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 compatível. Como alternativa, você pode definir um ponteiro para o tipo alterável.

Você deve fornecer as rotinas de dimensionamento, marshaling e desmarcação dos dados, além de liberar a memória associada. A tabela a seguir descreve os quatro nomes de rotina fornecidos pelo usuário. O <tipo> é o tipo de usuário especificado na definição de tipo [wire_marshal].

Rotina Descrição
<tipo>_UserSize Dimensiona o buffer de dados RPC antes de realizar marshaling no lado do cliente ou do servidor.
<tipo>_UserMarshal Realiza marshaling dos dados no lado do cliente ou do servidor.
<tipo>_UserUnmarshal Desmarca os dados no lado do cliente ou do servidor.
<tipo>_UserFree Libera os dados no lado do servidor.

 

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

Se o parâmetro for [ in] apenas, o cliente transmitirá para o servidor. O cliente precisa das <funções type>_UserSize e <type>_UserMarshal . O servidor precisa das <funções type>_UserUnmarshal e <type>_UserFree .

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

O atributo user_marshal

Regras de marshaling para user_marshal e wire_marshal

wire_marshal

user_marshal

NdrGetUserMarshalInfo