Typserialisierung

Der MIDL-Compiler generiert bis zu drei Funktionen für jeden Typ, auf den das Attribut [ codieren] oder [ decodierung] angewendet wird. Beispielsweise generiert der Compiler für einen benutzerdefinierten Typ namens MyType Code für die Funktionen MyType_Encode, MyType_Decode und MyType_AlignSize. Für diese Funktionen schreibt der Compiler Prototypen in Stub.h und Quellcode in Stub_c.c. Im Allgemeinen können Sie ein MyType-Objekt mit MyType_Encode codieren und ein Objekt aus dem Puffer mithilfe von MyType_Decode decodieren. MyType_AlignSize wird verwendet, wenn Sie die Größe des Marshallpuffers kennen müssen, bevor Sie ihn zuweisen.

Die folgende Codierungsfunktion wird vom MIDL-Compiler generiert. Diese Funktion serialisiert die Daten für das Objekt, auf das von pObject verwiesen wird, und der Puffer wird gemäß der im Handle angegebenen Methode abgerufen. Nachdem Sie die serialisierten Daten in den Puffer geschrieben haben, steuern Sie den Puffer. Beachten Sie, dass das Handle die status der vorherigen Aufrufe erbt und die Puffer an 8 ausgerichtet werden müssen.

Für ein implizites Handle:

void MyType_Encode (MyType __RPC_FAR * pObject);

Für ein explizites Handle:

void MyType_Encode (handle_t Handle, MyType __RPC_FAR * pObject);

Die folgende Funktion deserialisiert die Daten aus dem Speicher der Anwendung in das Objekt, auf das pObject verweist. Sie stellen einen gemarsten Puffer gemäß der im Handle angegebenen Methode bereit. Beachten Sie, dass das Handle die status der vorherigen Aufrufe erben kann und die Puffer an 8 ausgerichtet werden müssen.

Für ein implizites Handle:

void MyType_Decode (MyType __RPC_FAR * pObject);

Für ein explizites Handle:

void MyType_Decode (handle_t Handle, MyType __RPC_FAR * pObject);

Die folgende Funktion gibt eine Größe in Bytes zurück, die den Typ instance sowie alle Zum Ausrichten der Daten erforderlichen Auffüllungsbytes enthält. Dies ermöglicht das Serialisieren einer Reihe von Instanzen desselben oder unterschiedlichen Typs in einen Puffer, während gleichzeitig sichergestellt wird, dass die Daten für jedes Objekt entsprechend ausgerichtet sind. MyType_AlignSize geht davon aus, dass die instance, auf die pObject verweist, in einen Puffer gemarst wird, beginnend mit dem Offset, der auf 8 ausgerichtet ist.

Für ein implizites Handle:

size_t MyType_AlignSize (MyType __RPC_FAR * pObject);

Für ein explizites Handle:

size_t MyType_AlignSize (handle_t Handle, MyType __RPC_FAR * pObject);

Beachten Sie, dass sowohl Remoteprozeduren mit impliziten Bindungshandles als auch serialisierte Typen mit impliziten Serialisierungshandles dieselbe globale Handle-Variable verwenden. Daher ist es ratsam, die Typserialisierung und Remoteprozeduren in einer Schnittstelle nicht mit impliziten Handles zu kombinieren. Ausführliche Informationen finden Sie unter Implizite im Vergleich zu expliziten Handles.