Verwenden von Serialisierungsdiensten
MIDL generiert einen Serialisierungsstub für die Prozedur mit den Attributen [codieren] und [decodieren]. Wenn Sie diese Routine aufrufen, führen Sie einen Serialisierungsaufruf anstelle eines Remoteaufrufs aus. Die Prozedurargumente werden üblicherweise in einen Puffer gemarst oder aus einem Puffer getrennt. Anschließend haben Sie die vollständige Kontrolle über die Puffer.
Im Gegensatz dazu generiert MIDL Routinen, um Objekte dieses Typs zu vergrößern, zu codieren und zu decodieren, wenn Ihr Programm die Typserialisierung durchführt (ein Typ wird mit Serialisierungsattributen bezeichnet). Zum Serialisieren von Daten müssen Sie diese Routinen auf geeignete Weise aufrufen. Die Typserialisierung ist eine Microsoft-Erweiterung und als solche nicht verfügbar, wenn Sie im DCE-Kompatibilitätsmodus (/osf) kompilieren. Durch Verwendung der Attribute [codieren] und [decodieren] als Schnittstellenattribute wendet RPC die Codierung auf alle in der IDL-Datei definierten Typen und Routinen an.
Sie müssen ausreichend ausgerichtete Puffer bereitstellen, wenn Sie Serialisierungsdienste verwenden. Der Anfang des Puffers muss an einer Adresse ausgerichtet werden, die ein Vielfaches von 8 oder 8 Byte ausgerichtet ist. Für die Prozedurserialisierung muss jeder Prozeduraufruf in eine Pufferposition marshallen oder aufheben, die 8 Byte ausgerichtet ist. Für die Typserialisierung müssen Größenanpassung, Codierung und Decodierung an einer Position beginnen, die 8 Byte ausgerichtet ist.
Eine Möglichkeit für Ihre Anwendung, sicherzustellen, dass ihre Puffer ausgerichtet sind, besteht darin, die midl_user_allocate-Funktion so zu schreiben, dass sie ausgerichtete Puffer erstellt. Im folgenden Codebeispiel wird veranschaulicht, wie dies geschehen kann.
#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 );
}
Das folgende Beispiel zeigt die entsprechende midl_user_free-Funktion .
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 );
}