Udostępnij przez


Funkcja type_UserSize

Funkcja <typem>_UserSize jest funkcją pomocnika dla atrybutów [ wire_marshal] i [ user_marshal]. Wycinki wywołają tę funkcję w celu rozmiaru buforu danych RPC dla obiektu danych użytkownika, zanim dane są marshalowane po stronie klienta lub serwera. Funkcja jest zdefiniowana jako:

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

Typ <> w nazwie funkcji oznacza typ użytkownika określony w definicji typu [wire_marshal] lub [user_marshal]. Ten typ może być nieprzetransmitowalny lub nawet — w przypadku użycia z atrybutem [user_marshal] — nieznany kompilatorowi MIDL. Nazwa typu przewodu (nazwa typu przesyłanego przez sieć) nie jest używana w prototypie funkcji. Należy jednak pamiętać, że typ przewodu definiuje układ danych określony przez OSF DCE. Wszystkie dane muszą być konwertowane na format reprezentacji danych sieciowych (NDR).

Parametr pFlags jest wskaźnikiem do niepodpisanego pola flagi. Górne słowo flagi zawiera flagi formatu NDR zdefiniowane przez OSF DCE dla zmiennoprzecinkowych, kolejności bajtów i reprezentacji znaków. Dolne słowo zawiera flagę kontekstu marshalingu zdefiniowaną przez kanał COM. Dokładny układ flag w polu przedstawiono w poniższej tabeli.

Bitów Flaga Wartość
31-24 Reprezentacja zmiennoprzecinkowa 0 = IEEE 1 = VAX 2 = Cray 3 = IBM
23-20 Liczba całkowita i kolejność bajtów zmiennoprzecinkowych 0 = Big-endian 1 = Little-endian
19-16 Reprezentacja znaków 0 = ASCII 1 = EBCDIC
15-0 Flaga kontekstu marshalingu 0 = MSHCTX_LOCAL 1 = MSHCTX_NOSHAREDMEM 2 = MSHCTX_DIFFERENTMACHINE 3 = MSHCTX_INPROC

 

Flaga kontekstu marshalingu umożliwia zmianę zachowania procedury w zależności od kontekstu wywołania RPC. Jeśli na przykład masz dojście (długie) do bloku danych, możesz wysłać dojście do wywołania w procesie, ale rzeczywiste dane dla wywołania do innej maszyny będą wysyłane. Flaga kontekstu marshalingu i jego wartości są zdefiniowane w plikach Wtypes.h i Wtypes.idl w zestawie Sdk platformy.

Nuta

Gdy typ przewodu jest poprawnie zdefiniowany, nie trzeba używać flag formatu NDR, ponieważ aparat NDR wykonuje niezbędne konwersje.

 

StartingSize parametr jest bieżącym przesunięciem buforu. Rozmiar początkowy wskazuje przesunięcie buforu dla obiektu użytkownika i może być prawidłowo wyrównane. Twoja rutyna powinna uwzględniać wszelkie niezbędne dopełnienie.

Parametr pMyObj jest wskaźnikiem do obiektu typu użytkownika.

Wartość zwracana jest nowym przesunięciem lub pozycją buforu. Funkcja powinna zwrócić rozmiar skumulowany, który jest rozmiarem początkowym oraz możliwym dopełnieniem oraz rozmiarem danych.

Typ <>_UserSize może zwrócić nadmierną ilość wymaganego rozmiaru. Rzeczywisty rozmiar buforu wysłanego jest definiowany przez rozmiar danych, a nie przez rozmiar alokacji buforu.

Typ <>_UserSize nie jest wywoływany, jeśli rozmiar przewodu można obliczyć w czasie kompilacji. Należy pamiętać, że w przypadku większości związków, nawet jeśli nie ma wskaźników, rzeczywisty rozmiar reprezentacji przewodu można określić tylko w czasie wykonywania.

reguły marshalingu dla user_marshal i wire_marshal

user_marshal

wire_marshal