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.
Tópicos relacionados