Die Übertragung _ als Attribut
Das [ Attribut "Übertragen _ als" ] bietet eine Möglichkeit, das Marshalling von Daten zu steuern, ohne sich Gedanken über das Marshallen von Daten auf niedriger Ebene machen zu müssen– d. h. ohne sich Gedanken über Datengrößen oder Byteaustausche in einer heterogenen Umgebung machen zu müssen. Indem Sie die Menge der über das Netzwerk übertragenen Daten reduzieren können, kann die [ Übertragung _ als ] -Attribut ihre Anwendung effizienter machen.
Sie verwenden das [ Attribut transmit _ als ] , um einen Datentyp anzugeben, den die RPC-Stubs über das Netzwerk übertragen, anstatt den von der Anwendung bereitgestellten Datentyp zu verwenden. Sie stellen Routinen bereit, die den Datentyp in und aus dem Typ konvertieren, der für die Übertragung verwendet wird. Sie müssen auch Routinen bereitstellen, um den für den Datentyp und den übertragenen Typ verwendeten Arbeitsspeicher freizugeben. Im Folgenden wird beispielsweise der _ xmit-Typ als Datentyp definiert, der für alle Anwendungsdaten übertragen wird, die als _ Typspezifikation angegeben sind:
typedef [transmit_as (xmit_type)] type_spec type;
In der folgenden Tabelle werden die vier vom Programmierer bereitgestellten Routinenamen beschrieben. Typ ist der Datentyp, der der Anwendung bekannt ist, und _ xmit-Typ ist der Datentyp, der für die Übertragung verwendet wird.
| -Routine zurückgegebener Wert | BESCHREIBUNG |
|---|---|
| Type to xmit (Typ _ zu _ xmit) | Ordnet ein Objekt des übertragenen Typs zu und konvertiert vom Anwendungstyp in den Typ, der über das Netzwerk übertragen wird (Aufrufer und Objekt aufgerufen). |
| Typ _ aus _ xmit | Konvertiert vom übertragenen Typ in den Anwendungstyp (Aufrufer und Objekt aufgerufen). |
| Geben Sie _ free _ inst ein. | Gibt vom Anwendungstyp verwendete Ressourcen frei (nur Objekt aufgerufen). |
| Geben Sie _ free xmit ein. _ | Gibt vom Typ zurückgegebenen Speicher _ für die _ XMIT-Routine frei (Aufrufer und Objekt aufgerufen). |
Abgesehen von diesen vier vom Programmierer bereitgestellten Funktionen wird der übertragene Typ nicht von der Anwendung bearbeitet. Der übertragene Typ ist nur definiert, um Daten über das Netzwerk zu verschieben. Nachdem die Daten in den von der Anwendung verwendeten Typ konvertiert wurden, wird der vom übertragenen Typ verwendete Arbeitsspeicher freigegeben.
Diese vom Programmierer bereitgestellten Routinen werden entweder vom Client oder von der Serveranwendung basierend auf den direktionalen Attributen bereitgestellt. Wenn sich der Parameter nur [ in ] befindet, überträgt der Client an den Server. Der Client benötigt den Typ _ für _ xmit und den Typ free _ _ xmit-Funktionen. Der Server benötigt den Typ _ von _ xmit und _ typfreie _ inst-Funktionen. Bei einem [ ] out-only-Parameter überträgt der Server an den Client. Die Serveranwendung muss den Typ _ in _ xmit implementieren und _ _ XMIT-Funktionen freigeben, während das Clientprogramm den Typ aus der _ _ xmit-Funktion bereitstellen muss. Für die temporären _ XMIT-Typobjekte ruft der Stub den Typ free _ _ xmit auf, um jeglichen Arbeitsspeicher freizugeben, der durch einen Aufruf von type to _ _ xmit belegt wird.
Bestimmte Richtlinien gelten für die Anwendungstypinstanz. Wenn der Anwendungstyp ein Zeiger ist oder einen Zeiger enthält, muss der Typ aus der _ _ xmit-Routine Speicher für die Daten zuordnen, auf die die Zeiger zeigen (das Anwendungstypobjekt selbst wird vom Stub auf die übliche Weise bearbeitet).
Für [ ] Out- und [ In-, ] Out-Parameter ] oder eine ihrer Komponenten eines Typs, der die Übertragung [ _ als ] Attribut enthält, wird die _ typfreie _ inst-Routine automatisch für die Datenobjekte aufgerufen, die über das -Attribut verfügen. Für in -Parametern wird die _ typfreie _ Inst-Routine nur aufgerufen, wenn das [ Attribut "transmit _ as" ] auf den Parameter angewendet wurde. Wenn das Attribut auf die Komponenten des Parameters angewendet wurde, wird die _ typfreie _ inst-Routine nicht aufgerufen. Es gibt keine frei werdenden Aufrufe für die eingebetteten Daten und höchstens einen Aufruf (im Zusammenhang mit dem Attribut der obersten Ebene) für einen reinen In-Parameter.
Ab MIDL 2.0 müssen client und server alle vier Funktionen bereitstellen. Beispielsweise kann eine verknüpfte Liste als Array mit größenabhängiger Größe übertragen werden. Der Typ _ der _ XMIT-Routine durchläuft die verknüpfte Liste und kopiert die sortierten Daten in ein Array. Die Arrayelemente werden so sortiert, dass die vielen Zeiger, die der Listenstruktur zugeordnet sind, nicht übertragen werden müssen. Der Typ aus der _ _ XMIT-Routine liest das Array und fügt seine Elemente in eine Struktur mit verknüpften Listen ein.
Die doppelt verknüpfte Liste (DOUBLE _ LINK _ LIST) enthält Daten und Zeiger auf die vorherigen und nächsten Listenelemente:
typedef struct _DOUBLE_LINK_LIST
{
short sNumber;
struct _DOUBLE_LINK_LIST * pNext;
struct _DOUBLE_LINK_LIST * pPrevious;
} DOUBLE_LINK_LIST;
Anstatt die komplexe Struktur zu versenden, kann das [ Attribut transmit _ as ] verwendet werden, um es als Array über das Netzwerk zu senden. Die Reihenfolge der Elemente im Array behält die Reihenfolge der Elemente in der Liste zu geringeren Kosten bei:
typedef struct _DOUBLE_XMIT_TYPE
{
short sSize;
[size_is(sSize)] short asNumber[];
} DOUBLE_XMIT_TYPE;
Das [ Attribut "transmit _ as" ] wird in der IDL-Datei angezeigt:
typedef [transmit_as(DOUBLE_XMIT_TYPE)] DOUBLE_LINK_LIST DOUBLE_LINK_TYPE;
Im folgenden Beispiel definiert ModifyListProc den Parameter vom Typ DOUBLE _ LINK TYPE als _ [ ] in-out-Parameter:
void ModifyListProc([in, out] DOUBLE_LINK_TYPE * pHead)
Die vier vom Programmierer definierten Funktionen verwenden den Namen des Typs in den Funktionsnamen und die dargestellten und übertragenen Typen nach Bedarf als Parametertypen:
void __RPC_USER DOUBLE_LINK_TYPE_to_xmit (
DOUBLE_LINK_TYPE __RPC_FAR * pList,
DOUBLE_XMIT_TYPE __RPC_FAR * __RPC_FAR * ppArray);
void __RPC_USER DOUBLE_LINK_TYPE_from_xmit (
DOUBLE_XMIT_TYPE __RPC_FAR * pArray,
DOUBLE_LINK_TYPE __RPC_FAR * pList);
void __RPC_USER DOUBLE_LINK_TYPE_free_inst (
DOUBLE_LINK_TYPE __RPC_FAR * pList);
void __RPC_USER DOUBLE_LINK_TYPE_free_xmit (
DOUBLE_XMIT_TYPE __RPC_FAR * pArray);