Udostępnij przez


Funkcja type_UserMarshal

Funkcja <typem>_UserMarshal jest funkcją pomocnika dla atrybutów [ wire_marshal] i [ user_marshal]. Wycinki wywołają tę funkcję w celu marshalingu danych po stronie klienta lub serwera. Funkcja jest zdefiniowana jako:

unsigned char __RPC_FAR * __RPC_USER  <type>_UserMarshal(
    unsigned long __RPC_FAR * pFlags,
    unsigned char __RPC_FAR * pBuffer,
    <type>  __RPC_FAR *       pMyObj);

Typ <w nazwie funkcji oznacza> typ użytkownika określony w [wire_marshal] lub [user_marshal] definicji typu. Ten typ może być nieprzetłumaczalny, a nawet — w przypadku użycia z atrybutem [user_marshal] — typem nieznanym kompilatorowi MIDL. Nazwa typu przewodu (nazwa typu transmissible) nie jest używana w prototypie funkcji. Należy jednak pamiętać, że typ przewodu definiuje układ przewodu dla danych określonych przez OSF DCE.

Parametr pFlags jest wskaźnikiem do niepodpisanego pola długiej flagi. Górne słowo flagi zawiera flagi reprezentacji danych 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 został opisany w funkcja type_UserSize.

Parametr pBuffer jest bieżącym wskaźnikiem buforu. Ten wskaźnik może być wyrównany do wpisu lub może nie być wyrównany. Typ <,>_UserMarshal funkcja powinna odpowiednio wyrównać wskaźnik buforu, przeprowadzić marshaling danych i zwrócić nową pozycję buforu, czyli adres pierwszego bajtu po obiekcie marshaled. Należy pamiętać, że specyfikacja typu przewodu określa rzeczywisty układ danych w buforze.

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

Wartość zwracana jest nową pozycją buforu, która jest adresem pierwszego bajtu po niezamężnym obiekcie.

Przepełnienie buforu może wystąpić, gdy niepoprawnie obliczysz rozmiar danych i spróbujesz przeprowadzić marshaling większej ilości danych niż oczekiwano. Należy zachować ostrożność, aby uniknąć tej sytuacji. Możesz to sprawdzić przy użyciu wskaźnika, który <typ>_UserMarshal zwraca. W przeciwnym razie istnieje ryzyko, że aparat NDR zgłosi wyjątek przepełnienia buforu później.

Wyjątki muszą być przechwytywane i obsługiwane lokalnie, wyjątki nie mogą być propagowane w górę stosu wywołań.

reguły marshalingu dla user_marshal i wire_marshal

wire_marshal

user_marshal