Attributi di matrice e Sized-Pointer
MIDL offre un set completo di funzionalità per il passaggio di matrici di dati e puntatori ai dati. È possibile usare questi attributi per specificare le caratteristiche delle matrici e più livelli di puntatori.
Attributo | Utilizzo |
---|---|
size_is | Specifica la quantità di memoria da allocare per puntatori di dimensioni, puntatori di dimensioni a puntatori di dimensioni e matrici singole o multidimensionali. |
max_is | Valore massimo per un indice di matrice. |
length_is | Numero di elementi della matrice da trasmettere. |
first_is | Indice del primo elemento della matrice da trasmettere. |
last_is | Fornisce l'indice dell'ultimo elemento della matrice da trasmettere. |
string | Indica che la matrice char unidimensionale, wchar_t, byte (o equivalente) o il puntatore a tale matrice, deve essere gestito come stringa. |
Gamma | Specifica un intervallo di valori consentiti per argomenti o campi i cui valori vengono impostati in fase di esecuzione. |
MIDL supporta tre tipi di puntatori: puntatori di riferimento, puntatori univoci e puntatori completi. Questi puntatori vengono specificati dagli attributi del puntatore ref, univoci e ptr.
Un attributo puntatore può essere applicato come attributo di tipo; come attributo di campo che si applica a un membro della struttura, membro dell'unione o parametro; o come attributo di funzione che si applica al tipo restituito della funzione. L'attributo puntatore può essere visualizzato anche con la parola chiave pointer_default .
Per consentire a un parametro puntatore di modificare il valore durante una funzione remota, è necessario fornire un altro livello di indiretto fornendo più dichiaratori puntatori. L'attributo puntatore esplicito applicato al parametro influisce solo sul dichiaratore puntatore destro per il parametro. Quando sono presenti più dichiaratori puntatori in una dichiarazione di parametro, gli altri dichiaratori sono predefiniti per l'attributo puntatore specificato dall'attributo pointer_default . Per applicare diversi attributi puntatore a più dichiaratori puntatori, è necessario definire tipi intermedi che specificano gli attributi del puntatore esplicito.
Valori di Pointer-Attribute predefiniti
Quando nessun attributo puntatore è associato a un puntatore che è un parametro, si presuppone che il puntatore sia un puntatore di riferimento .
Quando nessun attributo puntatore è associato a un puntatore membro di una struttura o di un'unione, il compilatore MIDL assegna gli attributi del puntatore usando le regole di priorità seguenti (1 è più alto):
- Attributi applicati in modo esplicito al tipo di puntatore
- Attributi applicati in modo esplicito al parametro del puntatore o al membro
- Attributo pointer_default nel file IDL che definisce il tipo
- Attributo pointer_default nel file IDL che importa il tipo
- ptr (modalità osf); unique (modalità predefinita di Microsoft RPC)
Quando il file IDL viene compilato in modalità predefinita, i file importati possono ereditare gli attributi del puntatore dall'importazione di file. Questa funzionalità non è disponibile quando si compila l'opzione /osf . Per altre informazioni, vedere Importazione.
Tipi restituiti dalla funzione
Un puntatore restituito da una funzione deve essere un puntatore univoco o un puntatore completo. Il compilatore MIDL segnala un errore se un risultato di funzione è un puntatore di riferimento, in modo esplicito o per impostazione predefinita. Il puntatore restituito indica sempre una nuova risorsa di archiviazione.
Le funzioni che restituiscono un valore puntatore possono specificare un attributo puntatore come attributo funzione. Se un attributo puntatore non è presente, il puntatore al risultato della funzione usa il valore specificato come attributo pointer_default .
Attributi puntatore nelle definizioni dei tipi
Quando si specifica un attributo puntatore a livello superiore di un'istruzione typedef , l'attributo specificato viene applicato al dichiaratore puntatore, come previsto. Quando non viene specificato alcun attributo puntatore, i dichiaratori puntatori a livello superiore di un'istruzione typedef ereditano il tipo di attributo puntatore quando usato.
DCE IDL non consente l'applicazione esplicita dello stesso attributo puntatore due volte, ad esempio nella dichiarazione typedef e nell'elenco di attributi dei parametri. Quando si usa la modalità predefinita (estensioni Microsoft) del compilatore MIDL, questo vincolo viene rilassato.
Per una discussione sull'uso di matrici e puntatori MIDL nelle chiamate di routine remota, vedere Matrici e puntatori.