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.
Tópicos relacionados