Share via


Matrizes MIDL

Os declaradores de matriz aparecem no corpo da interface do arquivo IDL como um dos seguintes:

  • Parte de uma declaração geral
  • Um membro de uma estrutura ou declarador de união
  • Um parâmetro para uma chamada de procedimento remoto

Os limites de cada dimensão da matriz são expressos dentro de um par separado de colchetes. Uma expressão que é avaliada como n significa um limite inferior de zero e um limite superior de n - 1. Se os colchetes estiverem vazios ou contiverem um único asterisco (*), o limite inferior será zero e o limite superior será determinado em runtime.

A matriz também pode conter dois valores separados por reticências que representam os limites inferior e superior da matriz, como em [inferior... superior]. O Microsoft RPC requer um limite inferior de zero. O compilador MIDL não reconhece constructos que especificam limites inferiores diferente de zero.

As matrizes podem ser associadas aos atributos de campo size_is, max_is, length_is, first_is e last_is para especificar o tamanho da matriz ou a parte da matriz que contém dados válidos. Esses atributos de campo identificam o parâmetro, o campo de estrutura ou a constante que especifica a dimensão ou o índice da matriz.

A matriz deve ser associada ao identificador especificado pelo atributo de campo da seguinte maneira: quando a matriz é um parâmetro, o identificador também deve ser um parâmetro para a mesma função; quando a matriz é um campo de estrutura, o identificador deve ser outro campo de estrutura dessa mesma estrutura.

Uma matriz será chamada de "conformante" se o limite superior de qualquer dimensão for determinado em runtime. (Somente limites superiores podem ser determinados em runtime.) Para determinar o limite superior, a declaração de matriz deve incluir um atributo size_is ou max_is .

Uma matriz é chamada de "variável" quando seus limites são determinados em tempo de compilação, mas o intervalo de elementos transmitidos é determinado em runtime. Para determinar o intervalo de elementos transmitidos, a declaração de matriz deve incluir um atributo length_is, first_is ou last_is .

Uma matriz variável compatível (também chamada de "open") é uma matriz cujo limite superior e intervalo de elementos transmitidos são determinados em runtime. No máximo, uma matriz variável compatível ou compatível pode ser aninhada em uma estrutura C e deve ser o último elemento da estrutura. Por outro lado, matrizes variáveis não condicionais podem ocorrer em qualquer lugar em uma estrutura.

Exemplos

/* IDL file interface body */ 
#define MAX_INDEX 10 
 
typedef char  ATYPE[MAX_INDEX]; 
typedef short BTYPE[];        // Equivalent to [*]; 
typedef long  CTYPE[*][10];   // [][10] 
typedef float DTYPE[0..10];   // Equivalent to [11] 
typedef float ETYPE[0..(MAX_INDEX)];  
 
typedef struct 
{ 
    unsigned short size; 
    unsigned short length; 
    [size_is(size), length_is(length)] char string[*]; 
} counted_string; 
 
HRESULT MyFunction( 
     [in, out] short * pSize,  
     [in, out, string, size_is(*pSize)] char a[0..*] 
);

Para obter mais informações, consulte Matrizes e ponteiros.

Matrizes multidimensionais

O usuário pode declarar tipos que são matrizes e, em seguida, declarar matrizes de objetos desses tipos. A semântica de matrizes multidimensionais de tipos de matriz ndimensional é a mesma que a semântica de matrizes m+n dimensional.

Por exemplo, o tipo RECT_TYPE pode ser definido como uma matriz bidimensional e a rect variável pode ser definida como uma matriz de RECT_TYPE. Isso é equivalente à matriz tridimensional equivalent_rect:

typedef short int RECT_TYPE[10][20]; 
RECT_TYPE rect[15]; 
short int equivalent_rect[15][10][20];  // ~RECT_TYPE rect[15]

O Microsoft RPC é orientado para C. Seguindo as convenções de linguagem C, somente a primeira dimensão de uma matriz multidimensional pode ser determinada em runtime. A interoperação com matrizes de IDL de DCE que dão suporte a outras linguagens é limitada a:

  • Matrizes multidimensionais com limites constantes (compile-time-determined).
  • Matrizes multidimensionais com todos os limites constantes, exceto a primeira dimensão. O limite superior e o intervalo de elementos transmitidos da primeira dimensão dependem do runtime.
  • Todas as matrizes unidimensionais com um limite inferior de zero.

Quando o atributo [string] é usado em matrizes multidimensionais, o atributo se aplica à matriz mais à direita.

Matrizes de ponteiros

Os ponteiros de referência devem apontar para dados válidos. O aplicativo cliente deve alocar toda a memória para uma matriz [in] ou [in,out] de ponteiros de referência, especialmente quando a matriz está associada a valores [in], ou [in,out], [length_is]ou [last_is]. O aplicativo cliente também deve inicializar todos os elementos de matriz antes da chamada. Antes de retornar ao cliente, o aplicativo de servidor deve verificar se todos os elementos de matriz no intervalo transmitido apontam para um armazenamento válido.

No lado do servidor, o stub aloca armazenamento para todos os elementos de matriz, independentemente do valor [length_is] ou [last_is] no momento da chamada. Esse recurso pode afetar o desempenho do aplicativo.

Nenhuma restrição é colocada em matrizes de ponteiros exclusivos. No cliente e no servidor, o armazenamento é alocado para ponteiros nulos. Quando os ponteiros não são nulos, os dados são colocados no armazenamento pré-alocado.

Um declarador de ponteiro opcional pode preceder o declarador de matriz.

Quando os ponteiros de referência inseridos são [parâmetros somente out], o código server-manager deve atribuir valores válidos à matriz de ponteiros de referência. Por exemplo:

typedef [ref] short * ARefPointer;
typedef ARefPointer ArrayOfRef[10];
HRESULT proc1( [out] ArrayOfRef Parameter );

Os stubs gerados alocam a matriz e atribuem valores nulos a todos os ponteiros inseridos na matriz.