size_is-Attribut
Verwenden Sie das [size_is]-Attribut, um die Größe des Arbeitsspeichers in Elementen anzugeben, die für die Größe von Zeigern, größenzeiger Zeiger und einzelne oder mehrdimensionale Arrays zugeordnet sind.
[ size_is(limited-expression-list) ]
-
limited-expression-list
-
Gibt mindestens einen C-Sprachausdruck an. Jeder Ausdruck wird mit einer nicht negativen ganzzahligen Zahl ausgewertet, die die Menge des Arbeitsspeichers darstellt, der einem großen Zeiger oder einem Array zugeordnet ist. Gibt im Fall eines Arrays einen einzelnen Ausdruck an, der die Zuordnungsgröße in Elementen der ersten Dimension dieses Arrays darstellt. Der MIDL-Compiler unterstützt bedingte Ausdrücke, logische Ausdrücke, relationale Ausdrücke und arithmetische Ausdrücke. MIDL lässt keine Funktionsaufrufe in Ausdrücken zu und lässt keine Inkrement- und Dekrementoperatoren zu. Verwenden Sie Kommas als Platzhalter für implizite Parameter oder zum Trennen mehrerer Ausdrücke.
Wenn Sie das [size_is]-Attribut verwenden, um Arbeitsspeicher für ein mehrdimensionales Array zuzuweisen, und Sie array [ ] Notation verwenden, denken Sie daran, dass nur die erste Dimension eines mehrdimensionalen Arrays zur Laufzeit dynamisch bestimmt werden kann. Die anderen Dimensionen müssen statisch angegeben werden. Weitere Informationen zur Verwendung des Attributs [size_is] mit mehreren Zeigerebenen, damit ein Server ein Datenarray mit dynamischer Größe an einen Client zurückgeben kann, wie im Beispiel Proc7 gezeigt, finden Sie unter Mehrere Zeigerebenen.
Sie können entweder [size_is] oder max_is (aber nicht beide in derselben Attributliste) verwenden, um die Größe eines Arrays anzugeben, dessen Obergrenzen zur Laufzeit bestimmt werden. Beachten Sie jedoch, dass das Attribut [size_is] nicht für festgelegte Arraydimensionen verwendet werden kann. Das [max_is]-Attribut gibt den maximal gültigen Arrayindex an. Daher entspricht die Angabe von [size_is(n)] der Angabe von [max_is(n-1)].
Ein [ in] - oder [in, out]-konformer Parameter mit dem [ string]-Attribut muss nicht über das [size_is]- oder [max_is]-Attribut verfügen. In diesem Fall wird die Größe der Zuordnung aus dem NULL-Abschlussator der Eingabezeichenfolge bestimmt. Alle anderen konformen Arrays mit dem [string]-Attribut müssen über ein [size_is]- oder [max_is]-Attribut verfügen.
Obwohl es legal ist, das Attribut [size_is] mit einer Konstante zu verwenden, ist dies ineffizient und unnötig. Verwenden Sie beispielsweise ein Array mit fester Größe:
HRESULT Proc3([in] short Arr[MAX_SIZE]);
Anstelle von:
// legal but marshaling code is much slower
HRESULT Proc3([in size_is(MAX_SIZE)] short Arr[] );
Sie können die Attribute [size_is] und [length_is] zusammen verwenden. Wenn Sie dies tun, steuert das Attribut [size_is] die Menge des für die Daten zugewiesenen Arbeitsspeichers. Das Attribut [length_is] gibt an, wie viele Elemente übertragen werden. Die durch die Attribute [size_is] und [length_is] angegebene Arbeitsspeichermenge muss nicht identisch sein. Für instance kann Ihr Client einen [in,out]-Parameter an einen Server übergeben und eine große Speicherzuordnung mit [size_is] angeben, obwohl er eine kleine Anzahl von Datenelementen angibt, die mit [length_is] übergeben werden sollen. Dadurch kann der Server das Array mit mehr Daten füllen, als er empfangen hat, die er dann an den Client zurücksenden kann.
Im Allgemeinen ist es nicht sinnvoll, sowohl [size_is] als auch [length_is] für [ein]- oder [out]-Parameter anzugeben. In beiden Fällen steuert [size_is] die Speicherzuordnung. Ihre Anwendung könnte [size_is] verwenden, um mehr Arrayelemente zuzuweisen, als sie überträgt (gemäß [length_is]). Dies wäre jedoch ineffizient. Es wäre auch ineffizient, identische Werte für [size_is] und [length_is] anzugeben. Dies würde zusätzlichen Mehraufwand während des Parameter marshalings verursachen. Wenn die Werte von [size_is] und [length_is] immer identisch sind, lassen Sie das [length_is]-Attribut weg.
HRESULT Proc1(
[in] short m;
[in, size_is(m)] short a[]); // If m = 10, a[10]
HRESULT Proc2(
[in] short m;
[in, size_is(m)] short b[][20]); // If m = 10, b[10][20]
HRESULT Proc3(
[in] short m;
[size_is(m)] short * pshort); /* Specifies a pointer
to an m-sized block of shorts */
HRESULT Proc4(
[in] short m;
[size_is( , m)] short ** ppshort); /* Specifies a pointer
to a pointer to an m-sized
block of shorts */
HRESULT Proc5(
[in] short m;
[size_is(m ,)] short ** ppshort); /* Specifies an
m-sized block of pointers
to shorts */
HRESULT Proc6(
[in] short m;
[in] short n;
[size_is(m,n)] short ** ppshort); /* Specifies a pointer to an
m-sized block of pointers, each
of which points to an n-sized
block of shorts. m associates with
the pointer closeest to the identifer
it decorates. n associates with rest.*/
HRESULT Proc7(
[out] long * pSize,
[out, size_is( , *pSize)] my_type ** ppMyType); /* Specifies a pointer
to a sized pointer,
which points to a block
of my_types, whose size is
unknown when the stub
calls the server. */