Freigeben über


Top-Level und eingebettete Zeiger

Um zu verstehen, wie Zeiger und die zugehörigen Datenelemente in Microsoft RPC zugeordnet werden, müssen Sie zwischen Zeigern der obersten Ebene und eingebetteten Zeigern unterscheiden. Es ist auch hilfreich, auf die Gruppe aller Zeiger zu verweisen, die keine Zeiger der obersten Ebene sind.

Zeiger der obersten Ebene sind Zeiger , die als Namen von Parametern in Funktionsprototypen angegeben werden. Zeiger der obersten Ebene und deren Referenten werden immer auf dem Server zugeordnet.

Eingebettete Zeiger sind Zeiger, die in Datenstrukturen wie Arrays, Strukturen und Unions eingebettet sind. Wenn eingebettete Zeiger nur die Ausgabe in einen Puffer schreiben und bei der Eingabe NULL sind, kann die Serveranwendung ihre Werte in ungleich NULL ändern. In diesem Fall weisen die Clientstubs neuen Arbeitsspeicher für diese Daten zu.

Wenn der eingebettete Zeiger auf dem Client vor dem Aufruf nicht NULL ist, weisen die Stubs bei der Rückgabe keinen Arbeitsspeicher auf dem Client zu. Stattdessen versuchen die Stubs, den speicher, der dem eingebetteten Zeiger zugeordnet ist, in den vorhandenen Arbeitsspeicher auf dem Client zu schreiben, der diesem Zeiger zugeordnet ist, und überschreiben die bereits vorhandenen Daten.

Hinweis

Für Daten, die aus einem Puffer gelesen oder in einen Puffer geschrieben werden und die die Puffergröße nicht angeben, muss die Ausgabelänge kleiner oder gleich der Eingabelänge sein. Eine RPC-Ausnahme wird ausgelöst, wenn ein Überlauf erkannt wird. Bei Zeichenfolgendaten wird die Ausgabelänge bestimmt, indem die Länge der Eingabezeichenfolge überprüft wird. Daher dürfen Ausgabezeichenfolgen die Länge der Eingabezeichenfolgen nicht überschreiten. Es wird empfohlen, dies zu vermeiden, indem Sie immer einen größenspezifischen Parameter einschließen, um die Größe des Puffers anzugeben.

 

Eingebettete schreibgeschützte Zeiger werden unter Kombinieren von Zeiger- und Richtungsattributen erläutert.

Der Begriff Zeiger auf nicht oberster Ebene bezieht sich auf alle Zeiger, die nicht als Parameternamen im Funktionsprototyp angegeben sind, einschließlich eingebetteter Zeiger und mehrerer Ebenen von geschachtelten Zeigern.