固定バッファーのシリアル化
固定バッファー スタイルを使用する場合は、ハンドルで実行されるエンコード (マーシャリング) 操作に対応できる十分な大きさのバッファーを指定します。 マーシャリングを解除するときは、デコードするすべてのデータを含むバッファーを指定します。
シリアル化の固定バッファー スタイルでは、次のルーチンが使用されます。
MesEncodeFixedBufferHandleCreate 関数は、エンコード ハンドルに必要なメモリを割り当ててから初期化します。 アプリケーションは MesBufferHandleReset を呼び出してハンドルを再初期化するか、 MesHandleFree を呼び出してハンドルのメモリを解放できます。 固定スタイル エンコード ハンドルに対応するデコード ハンドルを作成するには、 MesDecodeBufferHandleCreate を使用する必要があります。
アプリケーションは MesHandleFree を 呼び出して、エンコードまたはデコードバッファー ハンドルを解放します。
固定バッファー エンコードの例
次のセクションでは、プロシージャ のエンコードに固定バッファー スタイルのシリアル化ハンドルを使用する方法の例を示します。
/*This is a fragment of the IDL file defining MooProc */
...
void __RPC_USER
MyProc( [in] handle_t Handle, [in,out] MyType * pMyObject,
[in, out] ThisType * pThisObject);
...
/*This is an ACF file. MyProc is defined in the IDL file */
[
explicit_handle
]
interface regress
{
[ encode,decode ] MyProc();
}
次の抜粋は、アプリケーションの一部を表しています。
if (MesEncodeFixedBufferHandleCreate (
Buffer, BufferSize,
pEncodedSize, &Handle) == RPC_S_OK)
{
...
/* Manufacture a MyObject and a ThisObject */
...
/* The serialization works from the beginning of the buffer because
the handle is in the initial state. The function MyProc does the
following when called with an encoding handle:
- sizes all the parameters for marshalling,
- marshalls into the buffer (and sets the internal state
appropriately)
*/
MyProc ( Handle, pMyObject, pThisObject );
...
MesHandleFree ();
}
if (MesDecodeBufferHandleCreate (Buffer, BufferSize, &Handle) ==
RPC_S_OK)
{
/* The MooProc does the following for you when called with a decoding
handle:
- unmarshalls the objects from the buffer into *pMooObject and
*pBarObject
*/
MyProc ( Handle, pMyObject, pThisObject);
...
MesHandleFree ( Handle );
}
次のセクションでは、型エンコードに固定バッファー スタイルシリアル化ハンドルを使用する方法の例を示します。
/* This is an ACF file. MyType is defined in the IDL file */
[
explicit_handle
]
interface regress
{
typedef [ encode,decode ] MyType;
}
次の抜粋は、関連するアプリケーション フラグメントを表しています。
if (MesEncodeFixedBufferHandleCreate (Buffer, BufferSize,
pEncodedSize, &Handle) == RPC_S_OK)
{
//...
/* Manufacture a MyObject and a pMyObject */
//...
MyType_Encode ( Handle, pMyObject );
//...
MesHandleFree ();
}
if (MesDecodeBufferHandleCreate (Buffer, BufferSize, &Handle) ==
RPC_S_OK )
{
MooType_Decode (Handle, pMooObject);
//...
MesHandleFree ( Handle );
}