Marshallregeln für user_marshal und wire_marshal

Die OSF-DCE-Spezifikation zum Marshallen eingebetteter Zeigertypen erfordert, dass Sie beim Implementieren der <Funktionen typ>_UserSize, <type>_UserMarshal und <type>_UserUnMarshal die folgenden Einschränkungen beachten. (Die hier aufgeführten Regeln und Beispiele gelten für marshalling. Ihre Größen- und Entmarsungsroutinen müssen jedoch die gleichen Einschränkungen befolgen:

  • Wenn es sich beim Drahttyp um einen flachen Typ ohne Zeiger handelt, sollte Ihre Marshallroutine für den entsprechenden Userm-Type die Daten einfach gemäß dem Layout des Drahttyps marshallen. Beispiel:

    typedef [wire_marshal (long)] void * HANDLE_HANDLE;
    

    Beachten Sie, dass der Drahttyp long ein flacher Typ ist. Ihre HANDLE_HANDLE_UserMarshal-Funktion marshallt lange , wenn ein HANDLE_HANDLE-Objekt an sie übergeben wird.

  • Wenn der Drahttyp ein Zeiger auf einen anderen Typ ist, sollte Ihre Marshallroutine für den entsprechenden userm-type die Daten gemäß dem Layout für den Typ, auf den der Drahttyp verweist, marshallen. Die NDR-Engine kümmert sich um den Zeiger. Beispiel:

    typedef struct HDATA
    {
        long size;
        [size_is(size)] long * pData;
    } HDATA;
    
    typedef HDATA * WIRE_TYPE;
    typedef [wire_marshal(WIRE_TYPE)] void * HANDLE_DATA;
    

    Beachten Sie, dass der Drahttyp WIRE_TYPE ein Zeigertyp ist. Ihre HANDLE_DATA_UserMarshal-Funktion marshallt die Daten im Zusammenhang mit dem Handle unter Verwendung des HDATA-Layouts anstelle des Layouts HDATA *.

  • Ein Drahttyp muss entweder ein flacher Datentyp oder ein Zeigertyp sein. Wenn ihr transmissibler Typ etwas anderes sein muss (z. B. eine Struktur mit Zeigern), verwenden Sie einen Zeiger auf den gewünschten Typ als Drahttyp.

Diese Einschränkungen haben zur Folge, dass die mit den Attributen [wire_marshal] oder [user_marshal] definierten Typen frei in andere Typen eingebettet werden können.

wire_marshal

user_marshal

Die type_UserSize-Funktion

Die type_UserMarshal-Funktion

Thetype_UserUnMarshalFunction

Thetype_UserFreeFunction