Eindeutiges Attribut

Das [unique] -Attribut gibt einen eindeutigen Zeiger an.

pointer_default(unique)

typedef [ unique [[ , type-attribute-list ]] ] type-specifier declarator-list; 

typedef struct-or-union-declarator 
{
    [ unique [[ , field-attribute-list ]] ] type-specifier declarator-list;
    ...}

[ unique [[ , function-attribute-list ]] ] type-specifier ptr-decl function-name(
    [[ [ parameter-attribute-list ] ]] type-specifier [[declarator]]
    , ...);

[[ [ function-attribute-list ] ]] type-specifier [[ptr-decl]] function-name(
    [ unique [[ , parameter-attribute-list ]] ] type-specifier [[declarator]]
    , ...);

Parameter

type-attribute-list

Gibt mindestens ein Attribut an, das für den Typ gilt. Gültige Typattribute sind [handle], [switch_type], [transmit_as]; das Zeigerattribute [ref], [unique] oder [ptr]; und die Verwendungsattribute [context_handle], [Zeichenfolge] und [ignorieren]. Trennen Sie mehrere Attribute durch Kommas.

Typspezifizierer

Gibt einen Basistyp, eine Struktur, eine Union, einen Enumerationstyp oder einen Typbezeichner an. Eine optionale Speicherspezifikation kann dem Typbezeichner vorangestellt werden.

deklarator und deklarator-list

Gibt Standard-C-Deklaratoren an, z. B. Bezeichner, Zeiger-Deklaratoren und Array-Deklaratoren. Weitere Informationen finden Sie unter Array- und Sized-Pointer Attribute, Arrays. und Arrays und Zeiger. Die Deklaratorliste besteht aus einem oder mehreren Deklaratoren, die durch Kommas getrennt sind. Der Parameternamebezeichner im Funktionsdeklarator ist optional.

struct-or-union-deklarator

Gibt eine MIDL-Struktur oder einen Union-Deklarator an.

field-attribute-list

Gibt null oder mehr Feldattribute an, die für den Strukturmember, den Union-Member oder den Funktionsparameter gelten. Gültige Feldattribute sind [first_is], [last_is], [length_is], [max_is], [size_is]; die Verwendungsattribute [string], [ignore] und [context_handle]; das Zeigerattribute [ref], [unique] oder [ptr]; und das Union-Attribut [switch_type]. Trennen Sie mehrere Feldattribute durch Kommas.

function-attribute-list

Gibt null oder mehr Attribute an, die für die Funktion gelten. Gültige Funktionsattribute sind [Rückruf], [lokal]; das Zeigerattribute [ref], [unique] oder [ptr]; und die Verwendungsattribute [Zeichenfolge], [ignorieren] und [context_handle].

ptr-decl

Gibt mindestens einen Zeigerdeklarator an, für den das Attribut [unique] gilt. Ein Zeigerdeklarations-Deklarator ist mit dem in C verwendeten Zeiger-Deklarator identisch. es wird aus dem *-Designator, Modifizierern wie far und dem Qualifizierer const erstellt.

Funktionsname

Gibt den Namen der Remoteprozedur an.

parameter-attribute-list

Besteht aus null oder mehr Attributen, die für den angegebenen Parametertyp geeignet sind. Parameterattribute können die Richtungsattribute [in] und [out]; die Feldattribute [first_is], [last_is], [length_is], [max_is], [size_is] und [switch_type]; das Zeigerattribute [ref], eindeutig oder ptr; und die Nutzungsattribute [context_handle] und [Zeichenfolge]. Das Verwendungsattribut [ignore] kann nicht als Parameterattribute verwendet werden. Trennen Sie mehrere Attribute durch Kommas.

Bemerkungen

Zeigerattribute können als Typattribute 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 Zeigerattribute kann auch mit dem [pointer_default] Schlüsselwort (keyword) angezeigt werden.

Ein eindeutiger Zeiger weist die folgenden Merkmale auf:

  • Kann den Wert NULL aufweisen.
  • Kann während eines Aufrufs von NULL in non-NULL, von non-NULL in NULL oder von einem Nicht-NULL-Wert in einen anderen geändert werden.
  • Kann neuen Arbeitsspeicher auf dem Client zuweisen. Wenn sich der eindeutige Zeiger von NULL in nicht NULL ändert, werden die vom Server zurückgegebenen Daten in den neuen Speicher geschrieben.
  • Kann vorhandenen Arbeitsspeicher auf dem Client verwenden, ohne neuen Arbeitsspeicher zuzuweisen. Wenn sich ein eindeutiger Zeiger während eines Aufrufs von einem Nicht-NULL-Wert in einen anderen ändert, wird davon ausgegangen, dass der Zeiger auf ein Datenobjekt desselben Typs zeigt. Vom Server zurückgegebene Daten werden in den vorhandenen Speicher geschrieben, der durch den Wert des eindeutigen Zeigers vor dem Aufruf angegeben wird.
  • Kann arbeitsspeicher auf dem Client verwaist werden. Arbeitsspeicher, auf den durch einen eindeutigen Zeiger ohne NULL verwiesen wird, wird möglicherweise nie freigegeben, wenn sich der eindeutige Zeiger während eines Aufrufs in NULL ändert und der Client keine andere Möglichkeit zum Deferencing des Speichers hat.
  • Führt nicht zu Aliasing. Wie der Speicher, auf den ein Verweiszeiger verweist, kann der Speicher, auf den ein eindeutiger Zeiger verweist, von keinem anderen Namen in der Funktion erreicht werden.

Die Stubs rufen die vom Benutzer bereitgestellten Speicherverwaltungsfunktionen midl_user_allocate und midl_user_free auf, um den für eindeutige Zeiger und deren Referenten erforderlichen Arbeitsspeicher zuzuordnen und zuzuordnen.

Die folgenden Einschränkungen gelten für eindeutige Zeiger:

  • Das Attribut [unique] kann nicht auf Bindungshandleparameter ( handle_t) und Kontexthandleparameter angewendet werden.
  • Das [eindeutige] Attribut kann nicht auf [out]-only-Zeigerparameter der obersten Ebene (Parameter, die nur das [out] -Richtungsattribut aufweisen) angewendet werden.
  • Standardmäßig sind Zeiger der obersten Ebene in Parameterlisten [ref] -Zeiger. Dies gilt auch dann, wenn die Schnittstelle pointer_default(eindeutig) angibt. Parameter der obersten Ebene in Parameterlisten müssen mit dem Attribut [unique] angegeben werden, um ein eindeutiger Zeiger zu sein.
  • Eindeutige Zeiger können nicht verwendet werden, um die Größe eines Arrays oder Unionarms zu beschreiben, da eindeutige Zeiger den Wert NULL aufweisen können. Diese Einschränkung verhindert den Fehler, der entsteht, wenn ein NULL-Wert als Arraygröße oder Union-Arm-Größe verwendet wird.

Beispiele

pointer_default(unique) 
 
typedef [unique, string] unsigned char * MY_STRING_TYPE; 
 
[unique] char * MyFunction([in, out, unique] long * plNumber);

Weitere Informationen

Arrays

Arrays und Zeiger

Array- und Sized-Pointer attribute

MIDL-Basistypen

Rückruf

const

context_handle

Enum

first_is

Behandeln

handle_t

Ignorieren

last_is

length_is

lokal

max_is

midl_user_allocate

midl_user_free

out

pointer_default

Ptr

Ref

size_is

Schnur

Struktur

switch_type

transmit_as

union