Partilhar via


Ponteiros (RPC)

Ponteiros comuns

Um ponteiro comum é definido como tudo menos 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 é usado se o ponteiro for um ponteiro para um tipo simples ou um ponteiro de cadeia de caracteres sem tamanho. O segundo formato é usado para ponteiros para todos os outros tipos. Os atributos de ponteiro indicam qual layout de descrição é com o sinalizador FC_SIMPLE_POINTER.

pointer_type<1> é uma das seguintes.

Formatar caractere Descrição
FC_RP Um ponteiro de referência.
FC_UP Um ponteiro único.
FC_FP Um ponteiro completo.
FC_OP Um ponteiro exclusivo em uma interface de objeto.

 

A razão para distinguir FC_OP é semântica: em interfaces de objeto, um ponteiro [in,out] deve ser liberado antes de desempacotar um novo objeto e atribuir um novo valor de ponteiro.

Pointer_attributes<1> pode ter qualquer uma das bandeiras mostradas na tabela a seguir.

Atributo Bandeira Descrição
01 FC_ALLOCATE_ALL_NODES O ponteiro faz parte de um esquema de alocação alocar(all_nodes).
02 FC_DONT_FREE Um ponteiro alocar(dont_free).
04 FC_ALLOCED_ON_STACK Um ponteiro cujo referente é alocado na pilha do stub.
08 FC_SIMPLE_POINTER Um ponteiro para um tipo simples ou cadeia de caracteres não dimensionada. Este 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 referente do ponteiro.

 

Os 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 conforme se size_is() for aplicada, uma matriz variável conforme se size_is() e length_is forem aplicadas).

Ponteiros de interface

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

Um ponteiro de interface com uma constante IID 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: longo, curto, curto, 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]. São utilizados os seguintes formatos:

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 pointee.