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.