Règles de marshaling pour user_marshal et wire_marshal
La spécification OSF-DCE pour marshaler les types de pointeurs incorporés nécessite que vous respectiez les restrictions suivantes lors de l’implémentation des <fonctions type>_UserSize, <type>_UserMarshal et <type>_UserUnMarshal. (Les règles et les exemples fournis ici sont destinés au marshaling. Toutefois, vos routines de dimensionnement et de démarshalation doivent respecter les mêmes restrictions:
Si le type de fil est un type plat sans pointeur, votre routine de marshaling pour le type userm correspondant doit simplement marshaler les données en fonction de la disposition du type de fil. Par exemple :
typedef [wire_marshal (long)] void * HANDLE_HANDLE;
Notez que le type de fil, long, est un type plat. Votre fonction HANDLE_HANDLE_UserMarshal marshale une longue chaque fois qu’un objet HANDLE_HANDLE lui est passé.
Si le type de fil est un pointeur vers un autre type, votre routine de marshaling pour le type userm correspondant doit marshaler les données en fonction de la disposition du type vers lequel pointe le type de fil. Le moteur NDR s’occupe du pointeur. Par exemple :
typedef struct HDATA { long size; [size_is(size)] long * pData; } HDATA; typedef HDATA * WIRE_TYPE; typedef [wire_marshal(WIRE_TYPE)] void * HANDLE_DATA;
Notez que le type de fil , WIRE_TYPE, est un type pointeur. Votre fonction HANDLE_DATA_UserMarshal marshale les données liées au handle, à l’aide de la disposition HDATA, plutôt que de la disposition HDATA * .
Un type de fil doit être un type de données plat ou un type pointeur. Si votre type transmissible doit être autre chose (une structure avec des pointeurs, par exemple), utilisez un pointeur vers le type souhaité comme type de fil.
L’effet de ces restrictions est que les types définis avec les attributs [wire_marshal] ou [user_marshal] peuvent être incorporés librement dans d’autres types.
Rubriques connexes