使用序列化服務

MIDL 會針對具有 [編碼] 和 [解碼] 屬性的程式產生序列化存根。 當您呼叫此常式時,您會執行序列化呼叫,而不是遠端呼叫。 程式引數會以一般方式封送處理至或取消封送處理緩衝區。 然後,您可以完全控制緩衝區。

相反地,當您的程式執行類型序列化時, (類型會以序列化屬性標示) 時,MIDL 會產生常式來調整、編碼和解碼該類型的物件大小、編碼和解碼物件。 若要序列化資料,您必須以適當的方式呼叫這些常式。 類型序列化是 Microsoft 擴充功能,因此,當您在 DCE 相容性 (/osf) 模式編譯時,無法使用。 使用 [encode] 和 [解碼] 屬性做為介面屬性,RPC 會將編碼套用至 IDL 檔案中定義的所有類型和常式。

使用序列化服務時,您必須提供適當對齊的緩衝區。 緩衝區的開頭必須對齊 8 或 8 位元組對齊的位址。 針對程式序列化,每個程序呼叫都必須從對齊 8 位元組的緩衝區位置封送處理至或取消封送處理。 針對類型序列化,調整大小、編碼和解碼必須從對齊 8 位元組的位置開始。

應用程式確保其緩衝區對齊的其中一種方式是寫入 midl_user_allocate 函式,使其建立對齊的緩衝區。 下列程式碼範例示範如何完成此作業。

#include <windows.h>

#define ALIGN_TO8(p)   (char *)((unsigned long)((char *)p + 7) & ~7)

void __RPC_FAR *__RPC_USER  MIDL_user_allocate(size_t sizeInBytes)
{
    unsigned char *pcAllocated;
    unsigned char *pcUserPtr;

    pcAllocated = (unsigned char *) malloc( sizeInBytes + 15 );
    pcUserPtr =  ALIGN_TO8( pcAllocated );
    if ( pcUserPtr == pcAllocated )
        pcUserPtr = pcAllocated + 8;

    *(pcUserPtr - 1) = pcUserPtr - pcAllocated;

    return( pcUserPtr );
}

下列範例顯示對應的 midl_user_free 函式。

void __RPC_USER  MIDL_user_free(void __RPC_FAR *f)
{
    unsigned char * pcAllocated;
    unsigned char * pcUserPtr;

    pcUserPtr = (unsigned char *) f;
    pcAllocated = pcUserPtr - *(pcUserPtr - 1);

    free( pcAllocated );
}