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.
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de