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
);
関連項目