Array- und Sized-Pointer attribute
MIDL bietet umfangreiche Features zum Übergeben von Datenarrays und Zeigern auf Daten. Sie können diese Attribute verwenden, um Merkmale von Arrays und mehreren Zeigerebenen anzugeben.
attribute | Verbrauch |
---|---|
size_is | Gibt die Menge an Arbeitsspeicher an, die für Größenzeiger, Größenzeiger auf Größenzeiger und ein- oder mehrdimensionale Arrays zugewiesen werden soll. |
max_is | Der maximale Wert für einen Arrayindex. |
length_is | Die Anzahl der zu übertragenden Arrayelemente. |
first_is | Der Index des ersten zu übertragenden Arrayelements. |
last_is | Gibt den Index des letzten zu übertragenden Arrayelements an. |
Schnur | Gibt an, dass das eindimensionale Zeichen, wchar_t- oder Bytearray oder der Zeiger auf ein solches Array als Zeichenfolge behandelt werden soll. |
Bereich | Gibt einen Bereich zulässiger Werte für Argumente oder Felder an, deren Werte zur Laufzeit festgelegt werden. |
MIDL unterstützt drei Arten von Zeigern: Verweiszeiger, eindeutige Zeiger und vollständige Zeiger. Diese Zeiger werden durch die Zeigerattribute ref, unique und ptr angegeben.
Ein Zeiger-Attribut kann als Type-Attribut angewendet werden. als Feldattribute, das für ein Strukturelement, ein Unionmitglied oder einen Parameter gilt; oder als Funktionsattribute, das für den Funktionsrückgabetyp gilt. Das Zeiger-Attribut kann auch mit dem pointer_default Schlüsselwort (keyword) angezeigt werden.
Damit sich der Wert eines Zeigerparameters während einer Remotefunktion ändern kann, müssen Sie eine weitere Dereferenzierungsebene bereitstellen, indem Sie mehrere Zeigerdeklaratoren bereitstellen. Das explizite Zeiger-Attribut, das auf den Parameter angewendet wird, wirkt sich nur auf den deklaratorischen Deklarator für den -Parameter am rechten Rand aus. Wenn in einer Parameterdeklaration mehrere Zeigerdeklaratoren vorhanden sind, verwenden die anderen Deklaratoren standardmäßig das zeiger-Attribut, das durch das pointer_default-Attribut angegeben wird. Um verschiedene Zeigerattribute auf mehrere Zeigerdeklaratoren anzuwenden, müssen Sie Zwischentypen definieren, die die expliziten Zeigerattribute angeben.
Standardwerte für Pointer-Attribute
Wenn einem Zeiger, der ein Parameter ist, kein Zeiger-Attribut zugeordnet ist, wird davon ausgegangen, dass der Zeiger ein Ref-Zeiger ist.
Wenn einem Zeiger kein Zeiger-Attribut zugeordnet ist, das Mitglied einer Struktur oder Union ist, weist der MIDL-Compiler Zeigerattribute unter Verwendung der folgenden Prioritätsregeln zu (1 ist der höchste Wert):
- Attribute, die explizit auf den Zeigertyp angewendet werden
- Attribute, die explizit auf den Zeigerparameter oder -member angewendet werden
- Das pointer_default-Attribut in der IDL-Datei, die den Typ definiert
- Das pointer_default-Attribut in der IDL-Datei, die den Typ importiert
- ptr (osf-Modus); unique (Microsoft RPC-Standardmodus)
Wenn die IDL-Datei im Standardmodus kompiliert wird, können importierte Dateien Zeigerattribute vom Importieren von Dateien erben. Dieses Feature ist nicht verfügbar, wenn Sie mit dem /osf-Schalter kompilieren. Weitere Informationen finden Sie unter Importieren.
Funktionsrückgabetypen
Ein von einer Funktion zurückgegebener Zeiger muss ein eindeutiger Zeiger oder ein vollständiger Zeiger sein. Der MIDL-Compiler meldet einen Fehler, wenn ein Funktionsergebnis ein Verweiszeiger ist, entweder explizit oder standardmäßig. Der zurückgegebene Zeiger gibt immer neuen Speicher an.
Funktionen, die einen Zeigerwert zurückgeben, können ein Zeigerattribute als Funktionsattribute angeben. Wenn kein Zeiger-Attribut vorhanden ist, verwendet der Funktions-Ergebniszeiger den als pointer_default-Attribut angegebenen Wert.
Zeigerattribute in Typdefinitionen
Wenn Sie ein Zeigerattribute auf der obersten Ebene einer typedef-Anweisung angeben, wird das angegebene Attribut wie erwartet auf den Zeigerdeklarator angewendet. Wenn kein Zeigerattribute angegeben wird, erben Zeigerdeklaratoren auf der obersten Ebene einer typedef-Anweisung den Zeigerattributetyp, wenn sie verwendet werden.
DcE IDL lässt nicht zu, dass dasselbe Zeigerattribute zweimal explizit angewendet wird, z. B. sowohl in der Typedef-Deklaration als auch in der Parameterattributeliste. Wenn Sie den Standardmodus (Microsoft-Erweiterungen) des MIDL-Compilers verwenden, wird diese Einschränkung gelockert.
Eine Erläuterung zur Verwendung von MIDL-Arrays und -Zeigern in Remoteprozeduraufrufen finden Sie unter Arrays und Zeiger.