user_marshal属性
user_marshal ACF 属性は、ターゲット言語 (userm-type) の名前付きローカル型を、クライアントとサーバーの間で転送される転送の種類 (ワイヤ型) に関連付けます。
typedef [user_marshal(userm_type)] wire-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);
-
userm-type
-
マーシャリングするユーザー データ型の識別子を指定します。 userm-type は送信可能である必要はありません。MIDL コンパイラに知られている型である必要はありません。
-
wire-type
-
クライアントとサーバーの間で実際に転送される名前付き転送データ型を指定します。 ワイヤタイプは、MIDL 基本タイプ、定義済みタイプ、またはネットワーク経由で送信できるタイプのタイプ識別子である必要があります。
-
pFlags
-
フラグ フィールド ( 符号なしlong) へのポインターを指定します。 高次ワードは、浮動小数点、ビッグ エンディアンまたはリトル エンディアン、および文字表現に対して DCE によって定義される NDR データ表現フラグを指定します。 下位ワードは、マーシャリング コンテキスト フラグを指定します。 フラグの正確なレイアウトについては、「 type_UserSize関数」を参照してください。
-
StartingSize
-
オブジェクトのサイズを変更する前に、現在のバッファー サイズ (オフセット) を指定します。
-
pUser_typeObject
-
userm_typeの オブジェクトへのポインターを指定します。
-
バッファー
-
現在のバッファー ポインターを指定します。
userm-type という名前の各ローカル型には、その型のワイヤ表現を定義するワイヤ型との一対一の対応があります。 マーシャリング用のデータのサイズを設定し、データのマーシャリングとマーシャリング解除を行い、メモリを解放するルーチンを指定する必要があります。 これらのルーチンの詳細については、「 user_marshal属性」を参照してください。 user_marshal または[wire_marshal] で定義されている埋め込み型がデータに存在する場合は、それらの埋め込み型のサービスも管理する必要があることに注意してください。
ワイヤ型は、インターフェイス ポインターまたは完全ポインターにすることはできません。 wire-type には、適切に定義されたメモリ サイズが必要です。 特定のワイヤ タイプをマーシャリングする方法の詳細については、「user_marshalとwire_marshalのマーシャリング ルール」を参照してください。
userm-type はインターフェイス ポインターにしないでください。これらは直接マーシャリングできるためです。 ユーザーの種類が完全なポインターの場合は、エイリアスを自分で管理する必要があります。
// Marshal a long as a structure containing two shorts.
typedef unsigned long FOUR_BYTE_DATA;
typedef struct _TWO_X_TWO_BYTE_DATA
{
unsigned short low;
unsigned short high;
} TWO_X_TWO_BYTE_DATA;
// ACFL file
typedef [user_marshal(FOUR_BYTE_DATA)] TWO_X_TWO_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);