共用方式為


使用串行化服務

MIDL 會為具有屬性 [編碼] 和 [譯碼] 的程式產生串行化存根。 當您呼叫此例程時,您會執行串行化呼叫,而不是遠端呼叫。 程序參數通常會以一般方式封送至緩衝區或從緩衝區取消封送。 接著,您可以完全控制緩衝區。

相反地,當您的程式執行類型序列化(類型帶有序列化屬性標籤)時,MIDL 會產生例程來調整、編碼和解碼該類型的物件。 若要串行化數據,您必須以適當的方式呼叫這些例程。 類型序列化是 Microsoft 的擴展功能,因此,在以 DCE 相容性模式編譯時,您無法使用 (/osf) 模式。 使用 [編碼] 和 [譯碼] 屬性作為介面屬性,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 );
}