Atributos de comprimento, tamanho e direção
Ao passar matrizes entre o cliente e o servidor, os atributos relacionados ao tamanho [max_is] e [size_is] determinam quantos elementos de matriz o stub do servidor aloca. Os atributos relacionados ao comprimento [length_is], [first_is] e [last_is] determinam quantos elementos são transmitidos ao servidor e ao cliente.
Atributos direcionais diferentes podem ser aplicados a parâmetros. No entanto, algumas combinações de atributos direcionais podem causar erros. Por exemplo, suponha que você esteja escrevendo uma interface que especifica um procedimento com dois parâmetros, uma matriz e o comprimento transmitido da matriz. O termo dir_attr refere-se ao atributo direcional aplicado ao parâmetro como:
Proc1(
[dir_attr] short *plength;
[dir_attr, length_is(pLength)] short array[MAX_SIZE]);
O comportamento do compilador MIDL para cada combinação de atributos direcionais é descrito na tabela a seguir.
Array | Parâmetro length | Ações de stub durante a chamada de cliente para servidor | Ações de stub no retorno do servidor para o cliente |
---|---|---|---|
[in] | [in] | Transmita o comprimento e o número de elementos indicados pelo parâmetro . | Nenhum dado transmitido. |
[in] | [out] | Não é legal; Erro do compilador MIDL. | Não é legal; Erro do compilador MIDL. |
[in] | [in, out] | Transmita o comprimento e o número de elementos indicados pelo parâmetro length. | Transmita somente o comprimento. |
[out] | [in] | Transmita o comprimento. Se o tamanho da matriz for fixo, aloque o tamanho da matriz no servidor, mas não transmita nenhum elemento. Se o tamanho da matriz não estiver associado, não será legal: erro do compilador MIDL. |
Transmita o número de elementos indicados pelo comprimento. Observe que o comprimento pode ser alterado e pode ter um valor diferente do valor no cliente. Não transmita o comprimento. |
[out] | [out] | Aloque espaço para o parâmetro de comprimento no servidor, mas não transmita o parâmetro . Se o tamanho da matriz for fixo, aloque o tamanho da matriz no servidor, mas não transmita nenhum elemento. Se o tamanho da matriz não for fixo, não será legal: erro do compilador MIDL. |
Transmita o comprimento e o número de elementos indicados pelo comprimento, conforme definido pelo aplicativo do servidor. |
[out] | [in, out] | Transmita o parâmetro de comprimento. Se o tamanho da matriz estiver associado, aloque o tamanho da matriz no servidor, mas não transmita nenhum elemento. Se o tamanho da matriz não estiver associado, não será legal: erro do compilador MIDL. |
Transmita o comprimento. Transmita o número de elementos de matriz indicados pelo comprimento. |
[in, out] | [in] | Transmita o comprimento e o número de elementos indicados pelo parâmetro . | Não transmita o comprimento. Transmita o número de elementos indicados pelo comprimento. Observe que o comprimento pode ser alterado e pode ter um valor diferente do valor original no cliente. |
[in, out] | [out] | Não é legal; Erro do compilador MIDL. | Não é legal; Erro do compilador MIDL. |
[in, out] | [in, out] | Transmita o comprimento e o número de elementos indicados pelo parâmetro . | Transmita o comprimento e o número de elementos indicados pelo parâmetro . |
Em geral, você não deve modificar os parâmetros de tamanho ou comprimento no lado do servidor. Se você alterar o parâmetro de comprimento, poderá criar memória órfã. Para obter mais informações, consulte Memory Orphaning.