transmit_as屬性
[transmit_as]屬性提供一種方式來控制資料封送處理,而不必擔心在低層級封送處理資料,也就是說,不必擔心異質環境中的資料大小或位元組交換。 藉由讓您減少透過網路傳輸的資料量, [transmit_as] 屬性可讓應用程式更有效率。
您可以使用 [transmit_as] 屬性來指定 RPC 存根會透過網路傳輸的資料類型,而不是使用應用程式所提供的資料類型。 您可以提供常式,以將資料類型轉換成用於傳輸的類型,以及從中轉換。 您也必須提供常式,以釋放用於資料類型和傳輸類型的記憶體。 例如,下列定義 xmit_type 為針對指定為類型 type_spec的所有應用程式資料所傳輸的資料類型:
typedef [transmit_as (xmit_type)] type_spec type;
下表描述四個程式設計人員提供的常式名稱。 類型 是應用程式已知的資料類型, xmit_type 是用於傳輸的資料類型。
常式傳回的值 | 描述 |
---|---|
type_to_xmit | 配置傳輸類型的物件,並從應用程式類型轉換為透過網路傳輸的類型, (呼叫端和稱為) 的物件。 |
Type_from_xmit | 從傳輸的類型轉換為應用程式類型, (呼叫端和稱為) 的物件。 |
Type_free_inst | 釋放應用程式類型所使用的資源 (物件,只呼叫) 。 |
Type_free_xmit | 釋放 類型*_*to_xmit 常式所傳回的儲存體, (呼叫端和稱為) 的物件。 |
除了這四個程式設計人員提供的函式以外,傳輸的類型不會由應用程式操作。 傳輸的類型只會定義為透過網路移動資料。 將資料轉換成應用程式所使用的類型之後,會釋放傳輸類型所使用的記憶體。
這些程式設計人員提供的常式是由用戶端或伺服器應用程式根據方向屬性提供。 如果參數僅為 [in] ,則用戶端會傳輸至伺服器。 用戶端需要 type_to_xmit 和 type_free_xmit 函式。 伺服器需要 type_from_xmit 和 type_free_inst 函式。 若為 [out]-only 參數,伺服器會傳送至用戶端。 伺服器應用程式必須實作 type_to_xmit 和 type_free_xmit 函式,而用戶端程式必須提供 type_from_xmit 函式。 對於暫 存xmit_type 物件,存根會呼叫 type*_*free_xmit ,以釋放呼叫所配置的任何記憶體 給type_to_xmit。
某些指導方針適用于應用程式類型實例。 如果應用程式類型是指標或包含指標,則 type_from_xmit 常式必須配置記憶體給指標指向的資料, (應用程式類型物件本身是由存根以一般方式操作) 。
對於 [out] 和 [in, out] out] 參數或其其中一個元件,其類型包含 [transmit_as] 屬性,系統會自動針對具有 屬性的資料物件呼叫 type_free_inst 常式。 針對in參數,只有在[transmit_as]屬性已套用至 參數時,才會呼叫type_free_inst常式。 如果屬性已套用至 參數的元件,則不會呼叫 type_free_inst 常式。 內嵌資料沒有釋放呼叫,而且 與僅限參數 中最上層屬性) 相關的最多一個呼叫 (。
在 MIDL 2.0 中有效,用戶端和伺服器都必須提供這四個函式。 例如,連結清單可以傳輸為大小陣列。 type_to_xmit常式會逐步執行連結清單,並將已排序的資料複製到陣列中。 陣列元素會經過排序,讓與清單結構相關聯的許多指標不需要傳輸。 type_from_xmit常式會讀取陣列,並將其元素放入連結清單結構中。
雙連結清單 (DOUBLE_LINK_LIST) 包含前一個和下一個清單元素的資料和指標:
typedef struct _DOUBLE_LINK_LIST
{
short sNumber;
struct _DOUBLE_LINK_LIST * pNext;
struct _DOUBLE_LINK_LIST * pPrevious;
} DOUBLE_LINK_LIST;
[transmit_as]屬性可用來透過網路傳送為數組,而不是傳送複雜結構。 陣列中的專案順序會以較低的成本保留清單中的專案順序:
typedef struct _DOUBLE_XMIT_TYPE
{
short sSize;
[size_is(sSize)] short asNumber[];
} DOUBLE_XMIT_TYPE;
[transmit_as]屬性會出現在 IDL 檔案中:
typedef [transmit_as(DOUBLE_XMIT_TYPE)] DOUBLE_LINK_LIST DOUBLE_LINK_TYPE;
在下列範例中, ModifyListProc 會將類型為 DOUBLE_LINK_TYPE 的參數定義為 [in, out] 參數:
void ModifyListProc([in, out] DOUBLE_LINK_TYPE * pHead)
四個程式設計人員定義函式會使用函式名稱中的類型名稱,並視需要使用呈現和傳輸的類型做為參數類型:
void __RPC_USER DOUBLE_LINK_TYPE_to_xmit (
DOUBLE_LINK_TYPE __RPC_FAR * pList,
DOUBLE_XMIT_TYPE __RPC_FAR * __RPC_FAR * ppArray);
void __RPC_USER DOUBLE_LINK_TYPE_from_xmit (
DOUBLE_XMIT_TYPE __RPC_FAR * pArray,
DOUBLE_LINK_TYPE __RPC_FAR * pList);
void __RPC_USER DOUBLE_LINK_TYPE_free_inst (
DOUBLE_LINK_TYPE __RPC_FAR * pList);
void __RPC_USER DOUBLE_LINK_TYPE_free_xmit (
DOUBLE_XMIT_TYPE __RPC_FAR * pArray);