Compartilhar via


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.

regras de marshaling para user_marshal e wire_marshal

wire_marshal

user_marshal