Dela via


Funktionen type_UserSize

Funktionen <typ>_UserSize är en hjälpfunktion för attributen [ wire_marshal] och [ user_marshal] . Stubs anropar den här funktionen för att ändra storleken på RPC-databufferten för användardataobjektet innan data konverteras på klient- eller serversidan. Funktionen definieras som:

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

Den <typen> i funktionsnamnet innebär användartypen, enligt beskrivningen i [wire_marshal] eller [user_marshal] typdefinition. Den här typen kan vara oöversatt eller till och med – när den används med attributet [user_marshal] – okänd för MIDL-kompilatorn. Namnet på trådtypen (namnet på den typ som överförs över nätverket) används inte i funktionsprototypen. Observera dock att trådtypen definierar layouten för data enligt OSF DCE. Alla data måste konverteras till NDR-format (Network Data Representation).

Parametern pFlags är en pekare till ett osignerat långt flaggfält. Det övre ordet i flaggan innehåller NDR-formatflaggor som definierats av OSF DCE för flyttal, byteordning och teckenrepresentationer. Det nedre ordet innehåller en kontextflagga som definieras av COM-kanalen. Den exakta layouten för flaggorna i fältet visas i följande tabell.

Bitar Flagga Värde
31-24 Flyttalsrepresentation 0 = IEEE 1 = VAX 2 = Cray 3 = IBM
23-20 Heltals- och flyttalsbyteordning 0 = Big-endian 1 = Little-endian
19-16 Teckenrepresentation 0 = ASCII 1 = EBCDIC
15-0 Kontextflagga för marskalkering 0 = MSHCTX_LOCAL 1 = MSHCTX_NOSHAREDMEM 2 = MSHCTX_DIFFERENTMACHINE 3 = MSHCTX_INPROC

 

Kontextflaggan för marskalkering gör det möjligt att ändra beteendet för din rutin beroende på kontexten för RPC-anropet. Om du till exempel har ett handtag (lång) till ett datablock kan du skicka handtaget för ett pågående anrop, men du skickar faktiska data för ett anrop till en annan dator. Kontextflaggan för marskalkering och dess värden definieras i filerna Wtypes.h och Wtypes.idl i Platform Software Development Kit (SDK).

Not

När trådtypen är korrekt definierad behöver du inte använda flaggorna i NDR-format eftersom NDR-motorn utför nödvändiga konverteringar.

 

StartingSize en parameter är den aktuella buffertförskjutningen. Startstorleken anger buffertförskjutningen för användarobjektet, och den kanske inte är korrekt justerad. Din rutin bör ta hänsyn till vad utfyllnad är nödvändigt.

Parametern pMyObj är en pekare till ett objekt av användartyp.

Returvärdet är den nya förskjutningen eller buffertpositionen. Funktionen ska returnera den kumulativa storleken, som är startstorleken plus möjlig utfyllnad plus datastorleken.

Funktionen <typ>_UserSize kan returnera en överskattning av den storlek som behövs. Den faktiska storleken på den skickade bufferten definieras av datastorleken, inte av buffertallokeringsstorleken.

Funktionen <typ>_UserSize anropas inte om trådstorleken kan beräknas vid kompileringstillfället. Observera att för de flesta fackföreningar, även om det inte finns några pekare, kan den faktiska storleken på trådrepresentationen endast fastställas vid körning.

Marskalkningsregler för user_marshal och wire_marshal

user_marshal

wire_marshal