A função type_UserMarshal
A função <tipo>_UserMarshal é uma função auxiliar para os atributos [ wire_marshal] e [ user_marshal]. Os stubs chamam essa função para fazer marshaling de dados no lado do cliente ou do servidor. A função é definida como:
unsigned char __RPC_FAR * __RPC_USER <type>_UserMarshal(
unsigned long __RPC_FAR * pFlags,
unsigned char __RPC_FAR * pBuffer,
<type> __RPC_FAR * pMyObj);
O tipo <> no nome da função significa que o tipo de usuário especificado no [wire_marshal] ou [user_marshal] definição de tipo. Esse tipo pode ser intransmissível ou até mesmo , quando usado com o atributo [user_marshal] , um tipo desconhecido para o compilador MIDL. O nome do tipo de fio (o nome do tipo transmissível) não é usado no protótipo da função. No entanto, observe que o tipo de fio define o layout de fio para os dados, conforme especificado pelo OSF DCE.
O parâmetro pFlags é um ponteiro para um campo de sinalizador longo sem sinal. A palavra superior do sinalizador contém sinalizadores de representação de dados NDR, conforme definido pelo OSF DCE para representações de ponto flutuante, ordem de bytes e caracteres. A palavra inferior contém um sinalizador de contexto de marshaling, conforme definido pelo canal COM. O layout exato dos sinalizadores dentro do campo é descrito em A função type_UserSize.
O parâmetro pBuffer é o ponteiro de buffer atual. Esse ponteiro pode ou não estar alinhado na entrada. Sua função <tipo>_UserMarshal deve alinhar o ponteiro do buffer adequadamente, fazer marshaling dos dados e retornar a nova posição de buffer, que é o endereço do primeiro byte após o objeto marshaled. Tenha em mente que a especificação de tipo de fio determina o layout real dos dados no buffer.
O parâmetro pMyObj é um ponteiro para um objeto de tipo de usuário.
O valor retornado é a nova posição de buffer, que é o endereço do primeiro byte após o objeto nãomarsalizado.
O estouro do buffer pode ocorrer quando você calcula incorretamente o tamanho dos dados e tenta fazer marshaling de mais dados do que o esperado. Você deve ter cuidado para evitar essa situação. Você pode verificar isso usando o ponteiro que <tipo>_UserMarshal retorna. Caso contrário, você corre o risco de fazer com que o mecanismo NDR gere uma exceção de estouro de buffer mais tarde.
As exceções devem ser capturadas e tratadas localmente, as exceções não devem ter permissão para propigar a pilha de chamadas.
Tópicos relacionados
-
regras de marshaling para user_marshal e wire_marshal