wire_marshal 属性

[wire_marshal] 属性は、アプリケーション固有のデータ型 (userm 型) ではなく、転送に使用されるデータ型 (ワイヤ型) を指定します。

typedef [wire_marshal(wire_type)] type-specifier userm-type; 
unsigned long __RPC_USER  < userm-type >_UserSize(
    unsigned long __RPC_FAR *pFlags,
    unsigned long StartingSize,
    < userm-type > __RPC_FAR * pUser_typeObject );
unsigned char __RPC_FAR * __RPC_USER  < userm-type >_UserMarshal(
    unsigned long  __RPC_FAR * pFlags,
    unsigned char __RPC_FAR * Buffer,
    < userm-type >  __RPC_FAR * pUser_typeObject);
unsigned char __RPC_FAR * __RPC_USER  < userm-type >_UserUnmarshal(
    unsigned long  __RPC_FAR *  pFlags,
    unsigned char __RPC_FAR *  Buffer,
    < userm-type > __RPC_FAR * pUser_typeObject);
void __RPC_USER  < userm-type >_UserFree(
    unsigned long  __RPC_FAR * pFlags,
    < userm-type >  __RPC_FAR * pUser_typeObject);

パラメーター

wire-type

クライアントとサーバーの間で実際に転送される名前付き転送データ型を指定します。 ワイヤ型は、MIDL 基本型、定義済みの型、またはネットワーク経由で送信できる型の型識別子である必要があります。

type-specifier

userm-type がエイリアスになる型。

userm-type

マーシャリングするユーザー データ型の識別子を指定します。 適切に定義されたサイズを持つ限り、 型指定子によって指定される任意の型を指定できます。 userm 型は送信可能である必要はありませんが、MIDL コンパイラに認識される型である必要があります。

pFlags

フラグ フィールド ( unsignedlong) へのポインターを指定します。 高次ワードは、浮動小数点、ビッグエンディアンまたはリトル エンディアン、および文字表現に対して DCE によって定義される NDR データ表現フラグを指定します。 下位ワードは、マーシャリング コンテキスト フラグを指定します。 フラグの正確なレイアウトについては、「 type_UserSize関数」を参照してください。

StartingSize

オブジェクトのサイズを変更する前に、現在のバッファー サイズ (オフセット) を指定します。

pUser_typeObject

userm_type のオブジェクトへのポインターを指定します

バッファー

現在のバッファー ポインターを指定します。

解説

各アプリケーション固有のデータ 型 userm-type には、種類 のワイヤ表現を定義する ワイヤ型 との 1 対 1 の対応があります。 データのマーシャリング、データのマーシャリングとマーシャリング解除、メモリの解放を行うルーチンを指定する必要があります。 [wire_marshal] または [user_marshal] で定義されている埋め込み型がデータに存在する場合は、それらの埋め込み型のサービスも管理する必要があることに注意してください。 これらのルーチンの詳細については、「 wire_marshal属性」を参照してください。

実装は、OSF-DCE 仕様に従ってマーシャリング規則に従う必要があります。 NDR 転送構文の詳細については、 を参照してください https://www.opengroup.org/onlinepubs/9629399/chap14.htm。 ワイヤ プロトコルに慣れていない場合は 、[wire_marshal] を 使用することはお勧めしません。

ワイヤ型は、インターフェイス ポインターまたは完全なポインターにすることはできません。 ワイヤタイプには、適切に定義されたメモリサイズが必要です。 特定のワイヤ タイプをマーシャリングする方法の詳細については、「user_marshalおよびwire_marshalのマーシャリング ルール」を参照してください。

これらは直接マーシャリングできるため、 userm 型 はインターフェイス ポインターにしないでください。 ユーザーの種類が完全なポインターである場合は、エイリアスを自分で管理する必要があります。

NDR エンジンは送信された型のメモリ割り当てを制御しないため、[wire_marshal] 属性を [allocate] 属性と共に直接または間接的に使用することはできません。

typedef unsigned long _FOUR_BYTE_DATA;

typedef struct _TWO_X_TWO_BYTE_DATA 
{
        unsigned short low;
        unsigned short high;
} TWO_X_TWO_BYTE_DATA;

typedef [wire_marshal(TWO_X_TWO_BYTE_DATA)] 
    _FOUR_BYTE_DATA FOUR_BYTE_DATA; 

//Marshaling functions:

// Calculate size that converted data will 
// require in the buffer
unsigned long __RPC_USER FOUR_BYTE_DATA_UserSize( 
    ULONG __RPC_FAR * pulFlags, 
    ULONG __RPC_FAR ulStartingSize,
    FOUR_BYTE_DATA __RPC_FAR * pul);

// Copy FOUR_BYTE_DATA into buffer as 
// TWO_X_TWO_BYTE_DATA
unsigned long __RPC_USER FOUR_BYTE_DATA_UserMarshal( 
    ULONG __RPC_FAR *pulFlags, 
    char __RPC_FAR * pBufferStart, 
    FOUR_BYTE_DATA __RPC_FAR * pul);

// Recreate FOUR_BYTE_DATA from TWO_X_TWO_BYTE_DATA in buffer
unsigned long __RPC_USER FOUR_BYTE_DATA_UserUnmarshal( 
    ULONG __RPC_FAR * pulFlags, 
    char __RPC_FAR * pBufferStart, 
    FOUR_BYTE_DATA __RPC_FAR * pul);

// Nothing to do here as the engine frees the top 
// node and FOUR_BYTE_DATA is a flat data type.
void __RPC_USER FOUR_BYTE_DATA_UserFree( 
    ULONG __RPC_FAR * pulFlags, 
    FOUR_BYTE_DATA __RPC_FAR * pul 
    );

関連項目

割り当てる

データ表現

MIDL 基本型

長い

NdrGetUserMarshalInfo

wire_marshal属性

transmit_as

符号 なし

user_marshal