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 型は、その型 のワイヤ表現を定義する ワイヤ型 と 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] 属性を直接または間接的に使用することはできません。

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