共用方式為


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常式會釋放清單的所有節點。