Regras de marshaling para user_marshal e wire_marshal

A especificação OSF-DCE para realizar marshaling de tipos de ponteiro inseridos requer que você observe as seguintes restrições ao implementar as <funções type>_UserSize, <type>_UserMarshal e <type>_UserUnMarshal. (As regras e os exemplos dados aqui são para marshaling. No entanto, suas rotinas de dimensionamento e desmarcação devem seguir as mesmas restrições:

  • Se o tipo de fio for um tipo simples sem ponteiros, sua rotina de marshaling para o tipo de usuário correspondente deverá simplesmente realizar marshaling dos dados de acordo com o layout do tipo de fio. Por exemplo:

    typedef [wire_marshal (long)] void * HANDLE_HANDLE;
    

    Observe que o tipo de fio, long, é um tipo simples. Sua função HANDLE_HANDLE_UserMarshal realiza marshaling longo sempre que um objeto HANDLE_HANDLE é passado para ele.

  • Se o tipo de fio for um ponteiro para outro tipo, sua rotina de marshaling para o tipo de usuário correspondente deverá realizar marshaling dos dados de acordo com o layout do tipo para o qual o tipo de fio aponta. O mecanismo NDR cuida do ponteiro. Por exemplo:

    typedef struct HDATA
    {
        long size;
        [size_is(size)] long * pData;
    } HDATA;
    
    typedef HDATA * WIRE_TYPE;
    typedef [wire_marshal(WIRE_TYPE)] void * HANDLE_DATA;
    

    Observe que o tipo de fio, WIRE_TYPE, é um tipo de ponteiro. Sua função HANDLE_DATA_UserMarshal realiza marshaling dos dados relacionados ao identificador, usando o layout HDATA, em vez do layout HDATA *.

  • Um tipo de fio deve ser um tipo de dados simples ou um tipo de ponteiro. Se o tipo transmissível precisar ser outra coisa (uma estrutura com ponteiros, por exemplo), use um ponteiro para o tipo desejado como o tipo de fio.

O efeito dessas restrições é que os tipos definidos com os atributos [wire_marshal] ou [user_marshal] podem ser inseridos livremente em outros tipos.

wire_marshal

user_marshal

A função type_UserSize

A função type_UserMarshal

Thetype_UserUnMarshalFunction

Thetype_UserFreeFunction