Condividi tramite


Matrici MIDL

I dichiaratori di matrice vengono visualizzati nel corpo dell'interfaccia del file IDL come uno dei seguenti:

  • Parte di una dichiarazione generale
  • Membro di una struttura o di un dichiaratore di unione
  • Parametro di una chiamata di procedura remota

I limiti di ogni dimensione della matrice sono espressi all'interno di una coppia separata di parentesi quadre. Un'espressione che restituisce n indica un limite inferiore pari a zero e un limite superiore di n - 1. Se le parentesi quadre sono vuote o contengono un singolo asterisco (*), il limite inferiore è zero e il limite superiore viene determinato in fase di esecuzione.

La matrice può contenere anche due valori separati da puntini di sospensione che rappresentano i limiti inferiori e superiori della matrice, come in [inferiore...superiore]. Microsoft RPC richiede un limite inferiore pari a zero. Il compilatore MIDL non riconosce costrutti che specificano limiti inferiori diversi da zero.

Le matrici possono essere associate agli attributi di campo size_is, max_is, length_is, first_is e last_is per specificare le dimensioni della matrice o della parte della matrice che contiene dati validi. Questi attributi di campo identificano il parametro, il campo della struttura o la costante che specifica la dimensione o l'indice della matrice.

La matrice deve essere associata all'identificatore specificato dall'attributo field nel modo seguente: quando la matrice è un parametro, l'identificatore deve anche essere un parametro per la stessa funzione; quando la matrice è un campo struttura, l'identificatore deve essere un altro campo struttura della stessa struttura.

Una matrice è denominata "conforme" se il limite superiore di qualsiasi dimensione viene determinato in fase di esecuzione. In fase di esecuzione è possibile determinare solo limiti superiori. Per determinare il limite superiore, la dichiarazione di matrice deve includere un attributo size_is o max_is.

Una matrice viene denominata "variabile" quando i limiti vengono determinati in fase di compilazione, ma l'intervallo di elementi trasmessi viene determinato in fase di esecuzione. Per determinare l'intervallo di elementi trasmessi, la dichiarazione di matrice deve includere un attributo length_is, first_is o last_is.

Una matrice variabile conforme (detta anche "aperta") è una matrice il cui limite superiore e l'intervallo di elementi trasmessi vengono determinati in fase di esecuzione. Al massimo, una matrice conforme o conforme può essere annidata in una struttura C e deve essere l'ultimo elemento della struttura. Al contrario, le matrici variabili non conformi possono verificarsi ovunque in una struttura.

Esempi

/* 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..*] 
);

Per altre informazioni, vedere Matrici e puntatori.

Matrici multidimensionali

L'utente può dichiarare tipi che sono matrici e quindi dichiarare matrici di oggetti di tali tipi. La semantica delle matrici m-dimensionali di tipi di matrice n-dimensionali è identica alla semantica delle matrici m+n-dimensionali.

Ad esempio, il tipo RECT_TYPE può essere definito come matrice bidimensionale e la variabile rect può essere definita come matrice di RECT_TYPE. Equivale alla matrice tridimensionale equivalent_rect:

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

Microsoft RPC è orientato a C. Seguendo le convenzioni del linguaggio C, è possibile determinare in fase di esecuzione solo la prima dimensione di una matrice multidimensionale. L'interoperabilità con matrici IDL DCE che supportano altri linguaggi è limitata a:

  • Matrici multidimensionali con limiti costanti (determinati dal tempo di compilazione).
  • Matrici multidimensionali con tutti i limiti costanti tranne la prima dimensione. Il limite superiore e l'intervallo di elementi trasmessi della prima dimensione dipendono dal runtime.
  • Qualsiasi matrice unidimensionale con un limite inferiore pari a zero.

Quando l'attributo [string] viene usato nelle matrici multidimensionali, l'attributo si applica alla matrice più a destra.

Matrici di puntatori

I puntatori di riferimento devono puntare a dati validi. L'applicazione client deve allocare tutta la memoria per una matrice [in] o [ in,out] di puntatori di riferimento, soprattutto quando la matrice è associata a [in], o [ in,out], [length_is], o [last_is] valori. L'applicazione client deve anche inizializzare tutti gli elementi della matrice prima della chiamata. Prima di tornare al client, l'applicazione server deve verificare che tutti gli elementi della matrice nell'intervallo trasmesso puntino a una risorsa di archiviazione valida.

Sul lato server, lo stub alloca l'archiviazione per tutti gli elementi della matrice, indipendentemente dal valore [length_is] o [last_is] al momento della chiamata. Questa funzionalità può influire sulle prestazioni dell'applicazione.

Non vengono applicate restrizioni alle matrici di puntatori univoci. Sia nel client che nel server, l'archiviazione viene allocata per i puntatori Null. Quando i puntatori non sono Null, i dati vengono inseriti nell'archiviazione preallocata.

Un dichiaratore di puntatore facoltativo può precedere il dichiaratore di matrice.

Quando i puntatori di riferimento incorporati sono parametri [out]-only, il codice server-manager deve assegnare valori validi alla matrice di puntatori di riferimento. Ad esempio:

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

Gli stub generati allocano la matrice e assegnano valori Null a tutti i puntatori incorporati nella matrice.