Ponteiros (RPC)

Ponteiros comuns

Um ponteiro comum é definido como tudo além de ponteiros de interface e ponteiros de contagem de bytes.

Há dois layouts possíveis para a descrição:

pointer_type<1> pointer_attributes<1>
simple_type<1> FC_PAD

–ou–

pointer_type<1> pointer_attributes<1>
offset_to_complex_description<2>

O primeiro formato será usado se o ponteiro for um ponteiro para um tipo simples ou um ponteiro de cadeia de caracteres não dimensionado. O segundo formato é usado para ponteiros para todos os outros tipos. Atributos de ponteiro indicam qual layout de descrição ele é com o sinalizador FC_SIMPLE_POINTER.

<pointer_type 1> é um dos seguintes.

Caractere de formato Descrição
FC_RP Um ponteiro de referência.
FC_UP Um ponteiro exclusivo.
FC_FP Um ponteiro completo.
FC_OP Um ponteiro exclusivo em uma interface de objeto.

 

O motivo para distinguir FC_OP é semântico: em interfaces de objeto, um ponteiro [in,out] deve ser liberado antes de cancelar a gravação de um novo objeto e atribuir um novo valor de ponteiro.

<Pointer_attributes 1> pode ter qualquer um dos sinalizadores mostrados na tabela a seguir.

Atributo Sinalizador Descrição
01 FC_ALLOCATE_ALL_NODES O ponteiro faz parte de um esquema de alocação (all_nodes).
02 FC_DONT_FREE Um ponteiro allocate(dont_free).
04 FC_ALLOCED_ON_STACK Um ponteiro cujo referencial é alocado na pilha do stub.
08 FC_SIMPLE_POINTER Um ponteiro para um tipo simples ou uma cadeia de caracteres não compatível. Esse sinalizador que está sendo definido indica o layout da descrição do ponteiro como o layout de ponteiro simples descrito acima, caso contrário, o formato do descritor com o deslocamento é indicado.
10 FC_POINTER_DEREF Um ponteiro que deve ser desreferenciado antes de manipular o referenciador do ponteiro.

 

Ponteiros que têm size_is(), max_is(), length_is(), last_is() e/ou first_is() aplicados a eles têm descrições de cadeia de caracteres de formato idênticas a um ponteiro para uma matriz do tipo apropriado (por exemplo, uma matriz compatível se size_is() for aplicada, uma matriz variável compatível se size_is() e length_is forem aplicados).

Ponteiros de interface

Uma cadeia de caracteres de formato de ponteiro de interface de objeto tem um dos dois formatos, dependendo se o IID correspondente é conhecido pelo compilador.

Um ponteiro de interface com um IID constante tem a seguinte descrição:

FC_IP FC_CONSTANT_IID 
iid<16>

A parte iid<16> é o IID real para o ponteiro da interface. O iid é gravado na cadeia de caracteres de formato em um formato idêntico à estrutura de dados guid: long, short, short, char [8].

A descrição de um ponteiro de interface com iid_is() aplicado a ele é:

FC_IP FC_PAD 
iid_description<> 

O iid_description<> é um descritor de correlação e tem 4 ou 6 bytes, dependendo se /robust é usado. O valor calculado pela função NdrComputeConformance é o ponteiro IID.

Ponteiros de contagem de bytes

Os ponteiros de contagem de bytes estão relacionados a um atributo de otimização especial chamado [byte_count]. Os seguintes formatos são usados:

FC_BYTE_COUNT_POINTER 
simple_type<1>
byte_count_description<> 

–E–

FC_BYTE_COUNT_POINTER 
FC_PAD
byte_count_description<> 
pointee_description<>

O byte_count_description<> é um descritor de correlação e tem 4 ou 6 bytes, dependendo se /robust é usado.

O pointee_description<> é uma descrição do tipo de ponto.