Partilhar via


Descritores de parâmetros

Como mencionado anteriormente, existem descritores de parâmetros de estilo –Oi e –Oif.

Os Descritores de Parâmetros –Oi

Stubs totalmente interpretados exigem informações adicionais para cada um dos parâmetros em uma chamada RPC. As descrições dos parâmetros de um procedimento seguem imediatamente após a descrição do procedimento.

Simples –Oi

Descritores de parâmetros

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âmetros

O formato da descrição para todos os outros tipos de parâmetros é:

param_direction<1> 
stack_size<1> 
type_offset<2>

Em que o campo param_direction<1> para cada uma destas descrições deve ser um dos indicados no quadro seguinte.

Hex 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 out.
52 FC_RETURN_PARAM Um valor de retorno de procedimento.
FC_IN_PARAM_NO_FREE_INST Um in 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

O modo –Oi não é suportado 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âmetros –Oif

Existem dois formatos possíveis para uma descrição de parâmetro, um para tipos de base, outro para todos os outros tipos.

Tipos de 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 é dado 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 onde o descritor de tipo para o argumento está localizado.

O campo de atributo de parâmetro é definido da seguinte forma:

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 de MustSize é definido somente se o parâmetro deve ser dimensionado.
  • O bit de MustFree é definido se o servidor deve chamar a rotina NdrFree* do parâmetro.
  • O bit de IsSimpleRef é definido para um parâmetro que é um ponteiro de referência para qualquer coisa diferente de outro ponteiro e que não tem atributos de alocação. Para tal tipo, o campo type_offset<> da descrição do parâmetro, exceto para um ponteiro de referência para um tipo base, fornece o deslocamento para o tipo do referente; o ponteiro de referência é simplesmente ignorado.
  • O bit IsDontCallFreeInst é definido para determinados parâmetros de represent_as cujas rotinas de instância livre não devem ser chamadas.
  • Os ServerAllocSize bits serão diferentes de zero se o parâmetro for [out], [in] ou [in,out] ponteiro para ponteiro ou ponteiro para enum16, e serão inicializados na pilha do interpretador do servidor, em vez de usar uma chamada para I_RpcAllocate. Se diferente de zero, esse valor é 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 de IsBasetype é definido para tipos simples que estão sendo empacotados pelo loop principal do interpretador de –Oif. Em particular, um tipo simples com um atributo range não é sinalizado como um tipo base para forçar o marshaling de rotina do intervalo através do despacho usando um token FC_RANGE.
  • O bit IsByValue é definido para tipos compostos enviados por valor, mas não é definido para tipos simples, independentemente de o argumento ser um ponteiro. Os tipos compostos para os quais é 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 principal no –Oicf interpretador, para garantir que os argumentos não simples (referidos como argumentos de tipo composto) sejam devidamente desreferenciados. Este bit nunca foi usado em versões anteriores do intérprete.