Serileştirme Hizmetlerini Kullanma
MIDL, [kodlama] ve [kodunu çözme ] öznitelikleriyle yordam için bir serileştirme saplaması oluşturur. Bu yordamı çağırdığınızda, uzak arama yerine bir serileştirme çağrısı yürütürsiniz. Yordam bağımsız değişkenleri, bir arabelleğe normal şekilde sıralanır veya arabellekten çıkarılır. Ardından arabelleklerin tam denetimine sahip olursunuz.
Buna karşılık, programınız tür serileştirmesi gerçekleştirdiğinde (bir tür serileştirme öznitelikleriyle etiketlenir), MIDL bu türdeki nesneleri boyutlandırmak, kodlamak ve kodunu çözmek için yordamlar oluşturur. Verileri seri hale getirmek için bu yordamları uygun şekilde çağırmanız gerekir. Tür serileştirme bir Microsoft uzantısıdır ve bu nedenle DCE uyumluluğu (/osf) modunda derlendiğinde kullanılamaz. Arayüz öznitelikleri olarak [kodlama] ve [kod çözme] özniteliklerini kullanarak RPC, IDL dosyasında tanımlanan tüm tür ve yöntemlere kodlama uygular.
Serileştirme hizmetlerini kullanırken uygun şekilde hizalanmış arabellekler sağlamanız gerekir. Arabelleğin başlangıcı, 8'in katı veya 8 bayt hizalanmış bir adrese hizalanmalıdır. Yordam serileştirmesi için, her yordam çağrısının 8 bayt hizalı bir arabellek konumuna marşal yapması veya konumdan demarşal yapması gerekir. Tür serileştirme için boyutlandırma, kodlama ve kod çözme 8 bayt hizalı bir konumda başlamalıdır.
Uygulamanızın arabelleklerinin hizalandığından emin olma yollarından biri, midl_user_allocate işlevini hizalanmış arabellekler oluşturacak şekilde yazmaktır. Aşağıdaki kod örneği bunun nasıl yapılabilmesini göstermektedir.
#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 );
}
Aşağıdaki örnekte ilgili midl_user_free işlevi gösterilmektedir.
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 );
}