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 den Satz 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 ihre Referenz 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 nicht NULL ändern. In diesem Fall weisen die Clientstubs neuen Arbeitsspeicher für diese Daten zu.
Wenn der eingebettete Zeiger vor dem Aufruf auf dem Client nicht NULL ist, weisen die Stubs dem Client bei der Rückgabe keinen Arbeitsspeicher 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 durch Überprüfen der Länge der Eingabezeichenfolge bestimmt. Daher dürfen Ausgabezeichenfolgen die Länge von Eingabezeichenfolgen nicht überschreiten. Die bewährte Methode besteht in der Vermeidung, indem immer ein von der Größe angegebener Parameter zur Angabe der Puffergröße verwendet wird.
Eingebettete Zeiger mit Schreibzugriff werden unter Kombinieren von Zeigern und direktionalen Attributen erläutert.
Der Begriff Zeiger auf Nicht-Topebene bezieht sich auf alle Zeiger, die nicht als Parameternamen im Funktionsprototyp angegeben sind, einschließlich eingebetteter Zeiger und mehrerer Ebenen geschachtelter Zeiger.