represent_as屬性
[ represent_as] 屬性可讓您指定如何將特定的可傳輸資料類型表示給應用程式。 做法是指定已知可傳輸型別的表示型別名稱,並提供轉換例程。 您也必須提供例程來釋放數據類型物件所使用的記憶體。
使用 [represent_as] 屬性來呈現具有不同、可能無法傳輸之數據類型的應用程式,而不是客戶端與伺服器之間實際傳輸的類型。 在 MIDL 編譯期間,應用程式作的類型也可能未知。 當您選擇定義完善的可傳輸類型時,不需要擔心異質環境中的數據表示。 [represent_as] 屬性可藉由減少透過網路傳輸的數據量,讓應用程式更有效率。
[represent_as] 屬性類似於 [ transmit_as] 屬性。 不過,雖然 [transmit_as] 可讓您指定將用於傳輸的數據類型,[represent_as] 可讓您指定應用程式數據類型的呈現方式。 表示的類型不需要在 MIDL 處理的檔案中定義;您可以在使用 C 編譯程式編譯存根時定義它。 若要這樣做,請使用 應用程式組態檔 (ACF) 中的 include 指示詞, 編譯適當的頭檔。 例如,下列 ACF 會針對可傳輸類型 named_type 定義應用程式的本機類型,repr_type:
typedef [represent_as(repr_type) [, type_attribute_list] named_type;
下表描述四個程式設計人員提供的例程。
常規 | 描述 |
---|---|
named_type_from_local | 配置網路類型的實例,並將本機類型轉換成網路類型。 |
named_type_to_local | 從網路類型轉換成本機類型。 |
named_type_free_local | 釋放呼叫 named_type_to_local 例程所配置的記憶體,但不會釋放類型本身。 |
named_type_free_inst | 釋放網路類型的記憶體(雙方)。 |
除了這四個程式設計人員提供的例程之外,應用程式不會作具名類型。 應用程式唯一可見的類型是表示的類型。 應用程式會使用表示的類型名稱,而不是編譯程式所產生的原型和存根中的傳輸型別名稱。 您必須為雙方提供一組例程。
對於暫存 named_type 物件,存根會呼叫 named_type_free_inst,以釋放呼叫 named_type_from_local所配置的任何記憶體。
如果表示的類型是指針或包含指標,則 named_type_to_local 例程必須配置指標指向的數據記憶體(代表的類型物件本身是由一般方式的存根所作)。 針對 [out] 和 [ 中的 [] 參數,包含 [represent_as或其其中一个组件] 類型的參數,系統會自動針對包含 屬性的數據物件呼叫 named_type_free_local 例程。 針對 [in] 參數,只有在 [represent_as] 屬性套用至 參數時,才會呼叫 named_type_free_local 例程。 如果屬性已套用至 參數的元件,則不會呼叫 *_free_local 例程。 [in] 僅限參數,不會針對內嵌數據呼叫和最多一次呼叫(與最上層屬性相關)呼叫釋放例程。
注意
可以將 [transmit_as] 和 [represent_as] 屬性套用至相同類型。 封送處理數據時,會先套用 [represent_as] 類型轉換,然後套用 [transmit_as] 轉換。 取消分割數據時,順序會反轉。 因此,封送處理時, *_from_local 配置具名類型的實例,並將它從本機類型物件轉譯為暫存具名類型物件。 這個物件是用於 *_to_xmit 例程的呈現類型物件。 *_to_xmit 例程接著會配置傳輸的類型物件,並將它從呈現的 (named) 物件轉譯為傳輸的物件。
長整數陣列可用來表示連結清單。 如此一來,應用程式會作清單,而且傳輸會在傳輸此類型清單時使用長整數陣列。 您可以從數位開始,但搭配開放式整數陣列使用 建構會比較方便。 下列範例示範如何執行這項作。
/* IDL definitions */
typedef struct_lbox
{
long data;
struct_lbox * pNext;
} LOC_BOX, * PLOC_BOX;
/* The definition of the local type visible to the application,
as shown above, can be omitted in the IDL file. See the include
in the ACF file. */
typedef struct_xmit_lbox
{
short Size;
[size_is(Size)] long DaraArr[];
} LONGARR;
void WireTheList( [in,out] LONGARR * pData );
/* ACF definitions */
/* If the IDL file does not have a definition for PLOC_BOX, you
can still ready it for C compilation with the following include
statement (notice that this is not a C include):
include "local.h";*/
typedef [represent_as(PLOC_BOX)] LONGARR;
請注意,使用 LONGARR 類型的例程原型實際上會顯示在 Stub.h 檔案中,做為 PLOC_BOX 取代 LONGARR 類型的。 Stub_c.c 檔案中適當的存根也是如此。
您必須提供下列四個函式:
void __RPC_USER
LONGARR_from_local(
PLOC_BOX __RPC_FAR * pList,
LONGARR __RPC_FAR * _RPC_FAR * ppDataArr );
void __RPC_USER
LONGARR_to_local(
LONGARR __RPC_FAR * _RPC_FAR * ppDataArr,
PLOC_BOX __RPC_FAR * pList );
void __RPC_USER
LONGARR_free_inst(
LONGARR __RPC_FAR * pDataArr);
void __RPC_USER
LONGARR_free_local(
PLOC_BOX __RPC_FAR * pList );
上述例程會執行下列動作:
- LONGARR_from_local 例程會計算清單的節點、配置大小 sizeof的 LONGARR 物件 (LONGARR) + Count*sizeof(long),將 Size 字段設定為 Count,並將數據複製到 DataArr 字段。
- LONGARR_to_local 例程會建立具有 Size 節點的清單,並將數位傳送至適當的節點。
- 在此案例中,LONGARR_free_inst 例程不會釋放任何專案。
- LONGARR_free_local 例程會釋放清單的所有節點。