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.