Mehrdimensionale Arrays
Arrayattribute können auch mit mehrdimensionalen Arrays verwendet werden. Achten Sie jedoch darauf, dass jede Dimension des Arrays über ein entsprechendes Attribut verfügt. Zum Beispiel:
/* IDL file */
[
uuid(ba209999-0c6c-11d2-97cf-00c04f8eea45),
version(2.0)
]
interface multiarray
{
void arr2d( [in] short d1size,
[in] short d2len,
[in, size_is( d1size, ), length_is ( , d2len) ] long array2d[*][30] ) ;
}
Das vorangehende Array ist ein konformes Array (größe d1size) von 30 Elementarrays (mit jeweils d2len Elementen). Das Komma in den Klammern des Attributs [size_is] gibt an, dass der Wert in d1size auf die erste Dimension des Arrays angewendet wird. Ebenso gibt der Befehl in den Klammern des Attributs [length_is] an, dass der Wert in d2len auf die zweite Dimension des Arrays angewendet wird.
Der MIDL 2.0-Compiler stellt zwei Methoden zum Marshalling von Parametern bereit: Gemischter Modus (/Os) und vollständig interpretiert (/Oif oder /Oicf). Standardmäßig kompiliert der MIDL-Compiler Schnittstellen im gemischten Modus. Sie müssen nicht explizit die /Os- Switch angeben, um das Marshaling im gemischten Modus zu erhalten.
Die vollständig interpretierten Methoden marshallen Daten vollständig offline. Dies reduziert die Größe des Stubcodes erheblich, führt aber auch zu einer verringerten Leistung. Im Mixed-Mode Marshaling marshallen die Stubs einige Parameter online. Dies führt zwar zu einer größeren Stubgröße, bietet aber auch eine höhere Leistung.
Vorsicht
Seien Sie vorsichtig beim Kompilieren von IDL-Dateien in diesem Modus. Die Verwendung von mehrdimensionalen Arrays im gemischten Modus kann zu Parametern führen, die nicht ordnungsgemäß gemarstet werden. Der /Oicf Befehlszeilenschalter wird empfohlen, wenn die Schnittstelle Parameter definiert, die multidimensionale Arrays sind.
Das Attribut [Zeichenfolge] kann auch mit mehrdimensionalen Arrays verwendet werden. Das Attribut gilt für die am wenigsten signifikante Dimension, z. B. ein konformes Array von Zeichenfolgen. Sie können auch mehrdimensionale Zeigerattribute verwenden. Zum Beispiel:
/* IDL file */
[
uuid(ba209999-0c6c-11d2-97cf-00c04f8eea45),
version(2.0)
]
interface multiarray
{
void arr2d([in] short d1len,
[in] short d2len,
[in] size_is(d1len, d2len) ] long ** ptr2d) ;
}
Im vorstehenden Beispiel ist die Variable ptr2d ein Zeiger auf einen d1len-Block von Zeigern, von denen jeder auf d2len Zeiger zeigt, um langen.
Multidimensionale Arrays entsprechen nicht den Arrays von Zeigern. Ein mehrdimensionales Array ist ein einzelner, großer Datenblock im Arbeitsspeicher. Ein Array von Zeigern enthält nur einen Zeigerblock im Array. Die Daten, auf die die Zeiger zeigen, können sich an einer beliebigen Stelle im Arbeitsspeicher befinden. Außerdem kann die ANSI C-Syntax nur die wichtigste Arraydimension (ganz links) in einem mehrdimensionalen Array nicht angegeben werden. Daher ist Folgendes eine gültige Anweisung:
long a1[] [20]
Vergleichen Sie dies mit der folgenden ungültigen Anweisung:
long a1[20] []