Partilhar via


A função type_UserSize

A função>_UserSize tipo<é 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 empacotados no lado do cliente ou 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 userm, conforme especificado na [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] — desconhecido para o compilador MIDL. O nome do tipo de fio (o nome do tipo transmitido através da rede) não é usado no protótipo da função. Observe, no entanto, que o tipo de fio define o layout para os dados, conforme especificado pelo OSF DCE. Todos os dados devem ser convertidos para o formato de representação de dados de rede (NDR).

O parâmetro pFlags é um ponteiro para um campo de sinalizador de longo não assinado. 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 empacotamento, conforme definido pelo canal COM. O layout exato das bandeiras dentro do campo é mostrado na tabela a seguir.

Bits Bandeira Valor
31-24 Representação de vírgula flutuante 0 = IEEE 1 = VAX 2 = Cray 3 = IBM
23-20 Ordem de bytes inteiros e de ponto flutuante 0 = Big-endian 1 = Little-endian
19-16 Representação de personagens 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 empacotamento torna possível alterar o comportamento da sua rotina dependendo do contexto para a chamada RPC. Por exemplo, se você tiver um identificador (longo) para um bloco de dados, você poderia enviar o identificador para uma chamada em processo, mas você enviaria os dados reais de uma chamada para uma máquina diferente. O sinalizador de contexto de empacotamento e seus valores são definidos nos arquivos Wtypes.h e Wtypes.idl no Platform Software Development Kit (SDK).

Observação

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

 

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

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

O valor de retorno é 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.

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

O <tipo>_UserSize função não é chamado se o tamanho do fio pode 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 de fio pode ser determinado apenas em tempo de execução.

Regras de marshaling para user_marshal e wire_marshal

user_marshal

wire_marshal