MIDL-Arrays

Array-Deklaratoren werden im Schnittstellentext der IDL-Datei wie folgt angezeigt:

  • Teil einer allgemeinen Erklärung
  • Ein Mitglied einer Struktur oder eines Union-Deklarators
  • Ein Parameter für einen Remoteprozeduraufruf

Die Grenzen jeder Dimension des Arrays werden in einem separaten Paar eckigen Klammern ausgedrückt. Ein Ausdruck, der mit n ausgewertet wird, bedeutet eine Untergrenze von null und eine Obergrenze von n - 1. Wenn die eckigen Klammern leer sind oder ein einzelnes Sternchen (*) enthalten, ist die Untergrenze 0, und die Obergrenze wird zur Laufzeit bestimmt.

Das Array kann auch zwei Werte enthalten, die durch eine Auslassungspunkte getrennt sind, die die Unter- und Obergrenze des Arrays darstellen, wie in [unter...upper]. Microsoft RPC erfordert eine Untergrenze von 0. Der MIDL-Compiler erkennt keine Konstrukte, die nichtzero-Untergrenzen angeben.

Arrays können den Feldattributen size_is, max_is, length_is, first_is und last_is zugeordnet werden, um die Größe des Arrays oder den Teil des Arrays anzugeben, der gültige Daten enthält. Diese Feldattribute identifizieren den Parameter, das Strukturfeld oder die Konstante, die die Arraydimension oder den Index angibt.

Das Array muss dem Bezeichner zugeordnet werden, der durch das Feldattribute auf folgende Weise angegeben wird: Wenn es sich bei dem Array um einen Parameter handelt, muss der Bezeichner auch ein Parameter für dieselbe Funktion sein. wenn das Array ein Strukturfeld ist, muss der Bezeichner ein anderes Strukturfeld derselben Struktur sein.

Ein Array wird als "konform" bezeichnet, wenn die Obergrenze einer Beliebigen Dimension zur Laufzeit bestimmt wird. (Zur Laufzeit können nur Obergrenzen bestimmt werden.) Um die Obergrenze zu bestimmen, muss die Arraydeklaration ein size_is- oder max_is-Attribut enthalten.

Ein Array wird als "variierend" bezeichnet, wenn seine Grenzen zur Kompilierzeit bestimmt werden, aber der Bereich der übertragenen Elemente wird zur Laufzeit bestimmt. Um den Bereich der übertragenen Elemente zu bestimmen, muss die Arraydeklaration ein length_is-, first_is- oder last_is-Attribut enthalten.

Ein konformes variierende Array (auch als "open" bezeichnet) ist ein Array, dessen Obergrenze und Bereich der übertragenen Elemente zur Laufzeit bestimmt werden. Höchstens ein konformes oder konformes array kann in einer C-Struktur geschachtelt werden und muss das letzte Element der Struktur sein. Im Gegensatz dazu können nicht unterschiedliche Arrays überall in einer Struktur auftreten.

Beispiele

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

Weitere Informationen finden Sie unter Arrays und Zeiger.

Mehrdimensionale Arrays

Der Benutzer kann Typen deklarieren, die Arrays sind, und dann Arrays von Objekten dieser Typen deklarieren. Die Semantik von mdimensionalen Arrays von n-dimensionalen Arraytypen ist identisch mit der Semantik von m+n-dimensionalen Arrays.

Beispielsweise kann der Typ RECT_TYPE als zweidimensionales Array und das Variablenrekt als Array von RECT_TYPE definiert werden. Dies entspricht dem dreidimensionalen Array 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 ist C-orientiert. Gemäß C-Sprachkonventionen kann zur Laufzeit nur die erste Dimension eines mehrdimensionalen Arrays bestimmt werden. Die Zusammenarbeit mit DCE-IDL-Arrays, die andere Sprachen unterstützen, ist auf folgendes beschränkt:

  • Mehrdimensionale Arrays mit konstanten (kompilierungszeitbestimmten) Grenzen.
  • Mehrdimensionale Arrays mit allen konstanten Grenzen mit Ausnahme der ersten Dimension. Die Obergrenze und der Bereich der übertragenen Elemente der ersten Dimension sind von der Laufzeit abhängig.
  • Alle eindimensionalen Arrays mit einer Untergrenze von 0.

Wenn das [string] -Attribut für mehrdimensionale Arrays verwendet wird, gilt das Attribut für das rechtsste Array.

Arrays von Zeigern

Verweiszeiger müssen auf gültige Daten verweisen. Die Clientanwendung muss den gesamten Arbeitsspeicher für ein [in]- oder [ein,out]-Array von Verweiszeigern zuordnen, insbesondere, wenn das Array mit [in]-, [in,out]-, [length_is]- oder [last_is]-Werten verknüpft ist. Die Clientanwendung muss auch alle Arrayelemente vor dem Aufruf initialisieren. Bevor sie an den Client zurückkehrt, muss die Serveranwendung überprüfen, ob alle Arrayelemente im übertragenen Bereich auf gültigen Speicher verweisen.

Auf der Serverseite weist der Stub speicher für alle Arrayelemente zu, unabhängig vom Wert [length_is] oder [last_is] zum Zeitpunkt des Aufrufs. Dieses Feature kann sich auf die Leistung Ihrer Anwendung auswirken.

Für Arrays mit eindeutigen Zeigern werden keine Einschränkungen festgelegt. Sowohl auf dem Client als auch auf dem Server wird Speicher für NULL-Zeiger zugewiesen. Wenn Zeiger nicht NULL sind, werden Die Daten im vorab zugeordneten Speicher abgelegt.

Ein optionaler Zeiger-Deklarator kann dem Array-Deklarator vorangehen.

Wenn eingebettete Verweiszeiger [out]only-Parameter sind, muss der Server-Manager-Code dem Array der Verweiszeiger gültige Werte zuweisen. Beispiel:

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

Die generierten Stubs weisen das Array zu und weisen allen im Array eingebetteten Zeigern NULL-Werte zu.