partial_ignore Attribut
Das ACF-Attribut [partial_ignore] definiert eine spezielle Version von [eindeutigen] Zeigern, die optionale Semantik bieten.
[ [function-attribute-list <>] ] type-specifier <> [pointer- <>declarator <>] function-name <>( [ partial_ignore [ , parameter-attribute-list <> ] ] type-specifier <> [declarator <>] , ...);
Bemerkungen
Beim Erstellen einer Funktion ist es üblich, Benutzern das Angeben eines nicht NULL-Zeigers zu optionalen Rückgabedaten zu ermöglichen, häufig als optionaler Zeiger bezeichnet. Der vom Benutzer hervorgehobene Speicher ist in der Regel nicht erforderlich, um initialisiert zu werden. Diese Technik stellt ein Problem dar, wenn die Funktion über RPC verwendet wird.
Wenn der optionale Zeiger gültig ist, aber auf nicht initialisierte Daten verweist, versucht RPC, diese Daten zu übertragen und an den Server zu senden, was dazu führen kann, dass das Marshaling fehlschlägt und den Aufruf abbricht. Selbst wenn das Marshaling erfolgreich ist, wird eine potenziell große Menge von unbrauchbaren Daten an den Server gesendet.
Diese Probleme werden gelöst, indem der Zeiger als [in, out, eindeutig, partial_ignore] markiert wird. Alle vier Attribute müssen vorhanden sein. Wenn ein [partial_ignore] -Zeiger auf der Clientseite gepostet ist, ist die einzige an den Server gesendete Daten ein Indikator, der anzeigt, ob der Zeiger NULL ist. Wenn der Zeiger nicht NULL ist, empfängt die serverseitige Routine einen gültigen Zeiger auf einen Speicherblock, der mit Nullen initialisiert wurde. Wenn der Zeiger NULL ist, erhält die serverseitige Routine einen NULL-Zeiger .
In dieser Situation muss die maximale Größe des Zeigers entweder zur Kompilierungszeit oder basierend auf Eingabeparametern gut definiert werden, da der Server Speicherplatz für den Speicherspeicherort zuweisen muss, auf den verwiesen wird. Ein einfacher [string] -Zeiger verfügt beispielsweise nicht über eine gut definierte Größe, da die Zeichenfolge implizit durch ein NULL-Zeichen beendet wird. In diesem Fall würde das Angeben der maximalen Größe der Zeichenfolge durch Hinzufügen eines [size_is] -Attributs die gut definierte Größenanforderung erreichen.
Beispiele
/* The MoveLeft function will move one position to the left and optionally return the previous position */
void MoveLeft([in, out, unique, partial_ignore] long *pPrevPosition);
Weitere Informationen