A função type_UserSize

A <função type>_UserSize é uma função auxiliar para os atributos [ wire_marshal] e [ user_marshal]. Os stubs chamam essa função para dimensionar o buffer de dados RPC para o objeto de dados do usuário antes que os dados sejam realizados em marshaling no lado do cliente ou do servidor. A função é definida como:

unsigned long __RPC_USER  <type>_UserSize(
    unsigned long __RPC_FAR * pFlags,
    unsigned long StartingSize,
    <type>  __RPC_FAR *pMyObj);

O <tipo> no nome da função significa o tipo de usuário, conforme 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] , desconhecido para o compilador MIDL. O nome do tipo de transmissão (o nome do tipo transmitido pela rede) não é usado no protótipo da função. Observe, no entanto, que o tipo de transmissão define o layout dos dados conforme especificado pelo OSF DCE. Todos os dados devem ser convertidos no formato NDR (representação de dados de rede).

O parâmetro pFlags é um ponteiro para um campo de sinalizador longo sem sinal . A palavra superior do sinalizador contém sinalizadores de formato 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 é mostrado na tabela a seguir.

Bits Sinalizador Valor
31-24 Representação de ponto flutuante 0 = IEEE 1 = VAX 2 = Cray 3 = IBM
23-20 Ordem de bytes de ponto flutuante e inteiro 0 = Big-endian 1 = Little-endian
19-16 Representação de caracteres 0 = ASCII 1 = EBCDIC
15-0 Sinalizador de contexto de marshaling 0 = MSHCTX_LOCAL 1 = MSHCTX_NOSHAREDMEM 2 = MSHCTX_DIFFERENTMACHINE 3 = MSHCTX_INPROC

 

O sinalizador de contexto de marshaling possibilita alterar o comportamento de sua rotina, dependendo do contexto da chamada RPC. Por exemplo, se você tiver um identificador (longo) para um bloco de dados, poderá enviar o identificador para uma chamada em processo, mas enviará os dados reais para uma chamada para um computador diferente. O sinalizador de contexto de marshaling e seus valores são definidos nos arquivos Wtypes.h e Wtypes.idl no SDK (Platform Software Development Kit).

Observação

Quando o tipo de fio é definido corretamente, você não precisa usar os sinalizadores de formato NDR, pois o mecanismo NDR executa as conversões necessárias.

 

O parâmetro StartingSize um é o deslocamento de buffer atual. O tamanho inicial indica o deslocamento do buffer para o objeto de usuário e pode ou não estar alinhado corretamente. Sua rotina deve levar em conta o preenchimento necessário.

O parâmetro pMyObj é um ponteiro para um objeto de tipo de usuário.

O valor retornado é a nova posição de deslocamento ou buffer. A função deve retornar o tamanho cumulativo, que é o tamanho inicial mais o preenchimento possível mais o tamanho dos dados.

A <função type>_UserSize pode retornar um superestimado do tamanho necessário. O tamanho real do buffer enviado é definido pelo tamanho dos dados, não pelo tamanho da alocação do buffer.

A <função type>_UserSize não será chamada se o tamanho da transmissão puder ser calculado em tempo de compilação. Observe que, para a maioria das uniões, mesmo que não haja ponteiros, o tamanho real da representação eletrônica só poderá ser determinado em tempo de execução.

Regras de marshaling para user_marshal e wire_marshal

user_marshal

wire_marshal