Partilhar via


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.

Simple –Oi

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.