Marshal do usuário

O marshal do usuário tem uma cadeia de caracteres de formato semelhante a transmit_as:

FC_USER_MARSHAL
flags<1>
quadruple_index<2>
user_type_memory_size<2>
transmitted_type_buffer size<2>
offset_to_the_transmitted_type<2>

Os sinalizadores<1> byte consistem na mordisca da bandeira superior e na mordisca de alinhamento inferior.

Os 2 bits superiores da mordisca de sinalizador são usados para descrever se o tipo de fio é definido como um ponteiro exclusivo, ponteiro de referência ou nenhum ponteiro (não pode ser um ptr). Os seguintes manifestos foram definidos para definir/obter os sinalizadores:

#define USER_MARSHAL_UNIQUE         0x80
#define USER_MARSHAL_REF            0x40
#define USER_MARSHAL_POINTER        0xc0  /* unique or ref */
#define USER_MARSHAL_IID            0x20  /* JIT compiler only */

A mordisca de alinhamento da palavra sinalizador mantém o alinhamento do fio do tipo transmitido.

O quadruple_index<2> é um índice da rotina de retorno de chamada quádruplo das funções de marshaling do usuário. As posições de rotina são as seguintes: dimensionamento, marshaling, unmarshaling e rotina de liberação.

O user_type_memory_size<2> fornece um tamanho para o tipo específico do usuário, incluindo tipos desconhecidos.

O transmitted_type_buffer_size<2> é zero quando o tamanho varia ou o tamanho fixo real. Essa é uma otimização que permite que MIDL ignore retornos de chamada ao dimensionar o buffer e também ao liberar.

Intervalo

A verificação [intervalo] fornece meios adicionais para validação de argumento na camada NDR. O descritor [range] tem o seguinte formato:

FC_RANGE,   flags_type <1>
low value<4>
high value<4>

As bandeiras tomam a mordisca superior e o tipo de mordisca inferior do segundo byte. Os valores baixo e alto dependem do tipo da variável a ser verificada.

Os sinalizadores são destinados como um veículo de expansão; o compilador está definindo a mordisca como zero.