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 );
}