Compartilhar via


A função type_UserMarshal

A <função type>_UserMarshal é uma função auxiliar para os atributos [ wire_marshal] e [ user_marshal]. Os stubs chamam essa função para realizar 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 o tipo de usuário especificado na definição de tipo [wire_marshal] ou [user_marshal] . Esse tipo pode ser intransmittable ou até mesmo , quando usado com o atributo [user_marshal] , um tipo desconhecido para o compilador MIDL. O nome do tipo de transmissão (o nome do tipo transmissível) não é usado no protótipo da função. Observe, no entanto, 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 DCE do OSF 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 type>_UserMarshal deve alinhar o ponteiro do buffer adequadamente, realizar 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 transmissão 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 do buffer, que é o endereço do primeiro byte após o objeto nãomarshaled.

O estouro de buffer pode ocorrer quando você calcula incorretamente o tamanho dos dados e tenta realizar marshaling de mais dados do que o esperado. Você deve ter cuidado para evitar essa situação. Você pode marcar nele usando o ponteiro que <_UserMarshal> retorna. Caso contrário, você correrá o risco de 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