Descritores de parâmetro
Conforme mencionado anteriormente, existem descritores de parâmetro de estilo –Oi e –Oif .
Os descritores do parâmetro –Oi
Stubs totalmente interpretados exigem informações adicionais para cada um dos parâmetros em uma chamada RPC. As descrições de parâmetro de um procedimento seguem imediatamente após a descrição do procedimento.
Descritores de parâmetro
O formato para a descrição de um parâmetro [in] ou de tipo simples de retorno é:
FC_IN_PARAM_BASETYPE
simple_type<1>
–ou–
FC_RETURN_PARAM_BASETYPE
simple_type<1>
Onde simple_type<1> é o token FC que indica o tipo simples. Os códigos são os seguintes:
4e FC_IN_PARAM_BASETYPE
53 FC_RETURN_PARAM_BASETYPE
Outros –Oi
Descritores de parâmetro
O formato para a descrição de todos os outros tipos de parâmetro é:
param_direction<1>
stack_size<1>
type_offset<2>
Em que o campo param_direction<1> para cada uma dessas descrições deve ser um dos mostrados na tabela a seguir.
Hex | Sinalizador | Significado |
---|---|---|
4d | FC_IN_PARAM | Um parâmetro in. |
50 | FC_IN_OUT_PARAM | Um parâmetro de entrada/saída. |
51 | FC_OUT_PARAM | Um parâmetro out. |
52 | FC_RETURN_PARAM | Um valor retornado pelo procedimento. |
4f | FC_IN_PARAM_NO_FREE_INST | Um em xmit/rep como um parâmetro para o qual nenhuma liberação é feita. |
O stack_size<1> é o tamanho do parâmetro na pilha, expresso como o número de inteiros que o parâmetro ocupa na pilha.
Observação
Não há suporte para o modo –Oi em plataformas de 64 bits.
O campo type_offset<2> é o deslocamento na tabela de cadeia de caracteres de formato de tipo, indicando o descritor de tipo para o argumento .
Os descritores de parâmetro –Oif
Há dois formatos possíveis para uma descrição de parâmetro, um para tipos base, outro para todos os outros tipos.
Tipos base:
PARAM_ATTRIBUTES<2>
stack_offset<2>
type_format_char<1>
unused<1>
Outros:
PARAM_ATTRIBUTES<2>
stack_offset<2>
type_offset<2>
Em ambos os stack_offset<2> indica o deslocamento na pilha de argumentos virtuais, em bytes. Para tipos base, o tipo de argumento é fornecido diretamente pelo caractere de formato correspondente ao tipo . Para outros tipos, o campo type_offset<2> fornece o deslocamento na tabela de cadeia de caracteres de formato de tipo em que o descritor de tipo para o argumento está localizado.
O campo de atributo de parâmetro é definido da seguinte maneira:
typedef struct
{
unsigned short MustSize : 1; // 0x0001
unsigned short MustFree : 1; // 0x0002
unsigned short IsPipe : 1; // 0x0004
unsigned short IsIn : 1; // 0x0008
unsigned short IsOut : 1; // 0x0010
unsigned short IsReturn : 1; // 0x0020
unsigned short IsBasetype : 1; // 0x0040
unsigned short IsByValue : 1; // 0x0080
unsigned short IsSimpleRef : 1; // 0x0100
unsigned short IsDontCallFreeInst : 1; // 0x0200
unsigned short SaveForAsyncFinish : 1; // 0x0400
unsigned short Unused : 2;
unsigned short ServerAllocSize : 3; // 0xe000
} PARAM_ATTRIBUTES, *PPARAM_ATTRIBUTES;
- O bit MustSize será definido somente se o parâmetro precisar ser dimensionado.
- O bit MustFree será definido se o servidor precisar chamar a rotina NdrFree* do parâmetro.
- O bit IsSimpleRef é definido para um parâmetro que é um ponteiro de referência para qualquer outra coisa que não seja outro ponteiro e que não tem atributos alocados. Para esse tipo, o campo type_offset<> da descrição do parâmetro, exceto um ponteiro de referência para um tipo base, fornece o deslocamento para o tipo do referencial; o ponteiro de referência é simplesmente ignorado.
- O bit IsDontCallFreeInst é definido para determinados parâmetros represent_as cujas rotinas de instância livre não devem ser chamadas.
- Os bits ServerAllocSize não serão zero se o parâmetro for [out], [in], ou [in,out] ponteiro para ponteiro ou ponteiro para enum16 e será inicializado na pilha do interpretador do servidor, em vez de usar uma chamada para I_RpcAllocate. Se diferente de zero, esse valor será multiplicado por 8 para obter o número de bytes para o parâmetro . Observe que isso significa que pelo menos 8 bytes são sempre alocados para um ponteiro.
- O bit IsBasetype é definido para tipos simples que estão sendo empacotados pelo loop do interpretador main –Oif. Em particular, um tipo simples com um atributo de intervalo não é sinalizado como um tipo base para forçar o marshaling de rotina de intervalo por meio da expedição usando um token FC_RANGE.
- O bit IsByValue é definido para tipos compostos que estão sendo enviados por valor, mas não é definido para tipos simples, independentemente de o argumento ser um ponteiro. Os tipos compostos para os quais ele é definido são estruturas, uniões, transmit_as, represent_as, wire_marshal e SAFEARRAY. Em geral, o bit foi introduzido para o benefício do loop do interpretador main no interpretador –Oicf, para garantir que os argumentos não simples (chamados de argumentos de tipo composto) sejam devidamente desreferenciados. Esse bit nunca foi usado em versões anteriores do interpretador.