Compartilhar 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 [em] ou retornar parâmetro de tipo simples é:

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.

Enfeitiçar Bandeira 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 de saída.
52 FC_RETURN_PARAM Um valor de retorno de procedimento.
4f FC_IN_PARAM_NO_FREE_INST Um xmit/rep in 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.

Nota

O modo –Oi não tem suporte 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>

Outro:

PARAM_ATTRIBUTES<2> 
stack_offset<2> 
type_offset<2>

Em ambos 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 MustSize bit 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 IsSimpleRef bit é 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 isDontCallFreeInst bit é 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 [], [em], 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 não for 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 isBasetype bit é definido para tipos simples que estão sendo empacotados pelo loop principal do interpretador do –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 IsByValue bit é 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 está definido são estruturas, uniões, transmit_as, represent_as, wire_marshal e SAFEARRAY. Em geral, o bit foi introduzido em benefício do loop do interpretador principal no interpretador do –Oicf, para garantir que os argumentos não simplificados (conhecidos como argumentos de tipo composto) sejam devidamente desreferenciados. Esse bit nunca foi usado em versões anteriores do interpretador.