型のシリアル化

MIDL コンパイラは、[ encode] 属性または [ decode] 属性が適用される型ごとに最大 3 つの関数を生成します。 たとえば、 MyType という名前のユーザー定義型の場合、コンパイラは、MyType_Encode、MyType_Decode、MyType_AlignSize関数のコードを生成します。 これらの関数の場合、コンパイラはプロトタイプを Stub.h に書き込み、ソース コードを Stub_c.c に書き込みます。 一般に、 myType オブジェクトを MyType_Encode でエンコードし、MyType_Decodeを使用してバッファーからオブジェクトをデコードできます。 MyType_AlignSizeは、マーシャリング バッファーを割り当てる前にサイズを把握しておく必要がある場合に使用されます。

MIDL コンパイラによって次のエンコード関数が生成されます。 この関数は、pObject が指すオブジェクトのデータをシリアル化し、ハンドルで指定されたメソッドに従ってバッファーを取得します。 シリアル化されたデータをバッファーに書き込んだ後、バッファーを制御します。 ハンドルは前の呼び出しの状態を継承し、バッファーは 8 に揃える必要があることに注意してください。

暗黙的なハンドルの場合:

void MyType_Encode (MyType __RPC_FAR * pObject);

明示的なハンドルの場合:

void MyType_Encode (handle_t Handle, MyType __RPC_FAR * pObject);

次の関数は、アプリケーションのストレージから pObject が指すオブジェクトにデータを逆シリアル化します。 マーシャリングされたバッファーは、ハンドルで指定されたメソッドに従って指定します。 ハンドルは前の呼び出しから状態を継承でき、バッファーは 8 に揃える必要があることに注意してください。

暗黙的なハンドルの場合:

void MyType_Decode (MyType __RPC_FAR * pObject);

明示的なハンドルの場合:

void MyType_Decode (handle_t Handle, MyType __RPC_FAR * pObject);

次の関数は、型インスタンスと、データの配置に必要な埋め込みバイトを含むサイズ (バイト単位) を返します。 これにより、同じ型または異なる型のインスタンスのセットをバッファーにシリアル化しながら、各オブジェクトのデータが適切にアラインされるようにすることができます。 MyType_AlignSizeは、pObject が指すインスタンスが、8 にアラインされたオフセットから始まるバッファーにマーシャリングされることを前提としています。

暗黙的なハンドルの場合:

size_t MyType_AlignSize (MyType __RPC_FAR * pObject);

明示的なハンドルの場合:

size_t MyType_AlignSize (handle_t Handle, MyType __RPC_FAR * pObject);

暗黙的バインディング ハンドルを持つリモート プロシージャと、暗黙的なシリアル化ハンドルを持つシリアル化された型の両方で、同じグローバル ハンドル変数が使用されることに注意してください。 したがって、型のシリアル化とリモート プロシージャを暗黙的なハンドルとインターフェイスに混在させないようにすることをお勧めします。 詳細については、「 暗黙的なハンドルと明示的なハンドル」を参照してください。