Die type_UserSize-Funktion

Die <Type>_UserSize-Funktion ist eine Hilfsfunktion für die Attribute [ wire_marshal] und [ user_marshal]. Die Stubs rufen diese Funktion auf, um den RPC-Datenpuffer für das Benutzerdatenobjekt zu vergrößern, bevor die Daten auf der Client- oder Serverseite gemarst werden. Die Funktion ist definiert wie folgt:

unsigned long __RPC_USER  <type>_UserSize(
    unsigned long __RPC_FAR * pFlags,
    unsigned long StartingSize,
    <type>  __RPC_FAR *pMyObj);

Der <Typ> im Funktionsnamen bedeutet den userm-type, wie in der [wire_marshal] oder [user_marshal] Typdefinition angegeben. Dieser Typ ist möglicherweise nicht transmitierbar oder sogar – wenn er mit dem Attribut [user_marshal] verwendet wird – dem MIDL-Compiler unbekannt. Der Name des Drahttyps (der Name des über das Netzwerk übertragenen Typs) wird im Funktionsprototyp nicht verwendet. Beachten Sie jedoch, dass der Drahttyp das Layout für die Daten definiert, wie von OSF DCE angegeben. Alle Daten müssen in das NDR-Format (Network Data Representation) konvertiert werden.

Der pFlags-Parameter ist ein Zeiger auf ein Feld ohne Vorzeichen mit langen Flags. Das obere Wort des Flags enthält NDR-Formatflags, wie von OSF DCE für Gleitkomma-, Bytereihenfolge- und Zeichendarstellungen definiert. Das untere Wort enthält ein Marshallkontextflag, das vom COM-Kanal definiert ist. Das genaue Layout der Flags innerhalb des Felds ist in der folgenden Tabelle dargestellt.

Bits Flag Wert
31-24 Gleitkommadarstellung 0 = IEEE 1 = VAX 2 = Cray 3 = IBM
23-20 Ganzzahlige Und Gleitkommabytereihenfolge 0 = Big-Endian 1 = Little-endian
19-16 Zeichendarstellung 0 = ASCII 1 = EBCDIC
15-0 Marshallkontextflag 0 = MSHCTX_LOCAL 1 = MSHCTX_NOSHAREDMEM 2 = MSHCTX_DIFFERENTMACHINE 3 = MSHCTX_INPROC

 

Das Marshallkontextflag ermöglicht es, das Verhalten Ihrer Routine abhängig vom Kontext für den RPC-Aufruf zu ändern. Wenn Sie beispielsweise über einen Handle (lang) für einen Datenblock verfügen, können Sie das Handle für einen Prozessaufruf senden, aber Sie würden die tatsächlichen Daten für einen Anruf an einen anderen Computer senden. Das Marshallkontextflag und die zugehörigen Werte werden in den Dateien Wtypes.h und Wtypes.idl im Platform Software Development Kit (SDK) definiert.

Hinweis

Wenn der Drahttyp ordnungsgemäß definiert ist, müssen Sie nicht die NDR-Formatflags verwenden, da die NDR-Engine die erforderlichen Konvertierungen durchführt.

 

Der StartingSize-Parameter ist der aktuelle Pufferoffset. Die Startgröße gibt den Pufferoffset für das Benutzerobjekt an, und er kann oder nicht ordnungsgemäß ausgerichtet werden. Ihre Routine sollte den erforderlichen Abstand berücksichtigen.

Der pMyObj-Parameter ist ein Zeiger auf ein Benutzertypobjekt.

Der Rückgabewert ist die neue Offset- oder Pufferposition. Die Funktion sollte die kumulative Größe zurückgeben, d. h. die Startgröße plus die mögliche Auffüllung plus die Datengröße.

Die <Type>_UserSize-Funktion kann eine Überschätzung der benötigten Größe zurückgeben. Die tatsächliche Größe des gesendeten Puffers wird durch die Datengröße und nicht durch die Pufferzuordnungsgröße definiert.

Die <Type>_UserSize-Funktion wird nicht aufgerufen, wenn die Drahtgröße zur Kompilierzeit berechnet werden kann. Beachten Sie, dass bei den meisten Gewerkschaften die tatsächliche Größe der Drahtdarstellung nur zur Laufzeit bestimmt werden kann, auch wenn keine Zeiger vorhanden sind.

Marshallregeln für user_marshal und wire_marshal

user_marshal

wire_marshal