Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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.
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. |
| 4º | 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.