user_marshalとwire_marshalのマーシャリング ルール

埋め込みポインター型をマーシャリングするための OSF-DCE 仕様では、型>_UserSize型_UserMarshal型_UserUnMarshal><><関数を実装<するときに、次の制限を遵守する必要があります。 (ここで示す規則と例は、マーシャリング用です。ただし、サイズ変更ルーチンと非マーシャリング ルーチンは、同じ制限に従う必要があります。

  • ワイヤ型がポインターのないフラット型の場合は、対応する userm 型のマーシャリング ルーチンで、ワイヤタイプのレイアウトに従ってデータをマーシャリングするだけです。 次に例を示します。

    typedef [wire_marshal (long)] void * HANDLE_HANDLE;
    

    ワイヤ タイプ long はフラット タイプであることに注意してください。 HANDLE_HANDLE_UserMarshal関数は、HANDLE_HANDLE オブジェクトが渡されるたびに 長い をマーシャリングします。

  • wire-type が別の型へのポインターである場合、対応する userm 型のマーシャリング ルーチンは、ワイヤ型が指す型のレイアウトに従ってデータをマーシャリングする必要があります。 NDR エンジンがポインターを処理します。 次に例を示します。

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

    ワイヤタイプ WIRE_TYPEはポインター型であることに注意してください。 HANDLE_DATA_UserMarshal関数は、HDATA * レイアウトではなく HDATA レイアウトを使用して、ハンドルに関連するデータをマーシャリングします。

  • ワイヤ型は、フラット データ型またはポインター型である必要があります。 読み取り可能な型が他の型である必要がある場合 (たとえば、ポインターを持つ構造体)、ワイヤ型として目的の型へのポインターを使用します。

これらの制限の影響は、[wire_marshal] 属性または [user_marshal] 属性で定義された型を他の型に自由に埋め込むことができるということです。

wire_marshal

user_marshal

type_UserSize関数

type_UserMarshal関数

Thetype_UserUnMarshalFunction

Thetype_UserFreeFunction