represent_as屬性
[ represent_as] 屬性可讓您指定如何將特定的可傳輸資料類型表示給應用程式。 做法是指定已知可傳輸型別的表示型別名稱,並提供轉換常式。 您也必須提供常式,以釋放資料類型物件所使用的記憶體。
使用 [represent_as] 屬性來呈現具有不同可能無法傳輸之資料類型的應用程式,而不是實際在用戶端與伺服器之間傳輸的類型。 此外,在 MIDL 編譯期間,應用程式操作的類型也可能未知。 當您選擇定義完善的可傳輸類型時,不需要擔心異質環境中的資料標記法。 [represent_as]屬性可藉由減少透過網路傳輸的資料量,讓您的應用程式更有效率。
[represent_as]屬性類似于 [ transmit_as] 屬性。 不過,雖然 [transmit_as] 可讓您指定將用於傳輸的資料類型, [represent_as] 可讓您指定如何為應用程式表示資料類型。 表示的類型不需要在 MIDL 處理的檔案中定義;您可以在使用 C 編譯器編譯存根時定義它。 若要這樣做,請使用 應用程式組態檔中的 include 指示詞, (ACF) 編譯適當的標頭檔。 例如,下列 ACF 會針對可傳輸的類型 named_type定義應用程式本機類型 repr_type:
typedef [represent_as(repr_type) [, type_attribute_list] named_type;
下表描述四個程式設計人員提供的常式。
常式傳回的值 | Description |
---|---|
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 常式必須為指標指向的資料配置記憶體, (表示的類型物件本身會以) 的一般方式操作。 對於包含[represent_as或其其中一個元件的型別的 [ out] 和 [ in, out] 參數,系統會自動針對包含 屬性的資料物件呼叫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 常式接著會配置傳輸的類型物件,並將它從所呈現的 () 物件轉譯為傳輸的物件。
長整數的陣列可用來表示連結的清單。 如此一來,應用程式會動作清單,而傳輸會在傳輸此類型的清單時使用長整數陣列。 您可以從陣列開始,但搭配開放式整數陣列的建構比較方便。 下列範例示範如何執行。
/* 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常式會計算清單的節點、配置SIZE 為 LONGARR 物件的 sizeof (LONGARR) + Count*sizeof (long) 、將Size欄位設定為 Count,並將資料複製到DataArr欄位。
- LONGARR_to_local常式會建立具有 Size 節點的清單,並將陣列傳輸至適當的節點。
- 在此情況下 ,LONGARR_free_inst 常式不會釋放任何內容。
- LONGARR_free_local常式會釋放清單的所有節點。