對於 user_marshal 和 wire_marshal 的封送處理規則
封送處理內嵌指標類型的 OSF-DCE 規格要求您在實作 <類型>_UserSize、<類型>_UserMarshal 和 <類型>_UserUnMarshal 函式時,注意下列限制。 (這裡提供的規則和範例是編組。不過,您的編組和解除編組例程必須遵循相同的限制):
如果 wire-type 是沒有指標的平坦類型,則相應的 userm-type 的封送處理例程應該僅依據 wire-type 的配置封送處理數據。 例如:
typedef [wire_marshal (long)] void * HANDLE_HANDLE;
請注意,長的電線類型是平面類型。 每當傳遞 HANDLE_HANDLE 物件時,您的 HANDLE_HANDLE_UserMarshal 函式會將 型別的 進行封送處理。
如果 wire-type 是指向另一種類型的指標,那麼你的 user-m 類型的封送處理例程應該根據 wire-type 所指向的類型配置來封送處理數據。 NDR 運算引擎會負責指針。 例如:
typedef struct HDATA { long size; [size_is(size)] long * pData; } HDATA; typedef HDATA * WIRE_TYPE; typedef [wire_marshal(WIRE_TYPE)] void * HANDLE_DATA;
請注意,WIRE_TYPE線類型是指針類型。 您的 HANDLE_DATA_UserMarshal 函式會使用 HDATA 配置來封送處理與柄相關的數據,而非使用 HDATA * 配置。
線型必須是平面數據類型或指標類型。 如果您的可傳遞類型必須是其他類型(例如具有指標的結構),建議使用指向所需類型的指標作為線路類型。
這些限制的效果是,使用 [wire_marshal] 或 [user_marshal] 屬性定義的類型可以自由內嵌在其他類型中。
相關主題