Bagikan melalui


Atribut represent_as

Atribut [ represent_as] memungkinkan Anda menentukan bagaimana jenis data tertentu yang dapat dikirimkan diwakili ke aplikasi. Ini dilakukan dengan menentukan nama jenis yang diwakili untuk jenis yang dapat ditransmisikan yang diketahui dan menyediakan rutinitas konversi. Anda juga harus menyediakan rutinitas untuk membebaskan memori yang digunakan oleh objek jenis data.

Gunakan atribut [represent_as] untuk menyajikan aplikasi dengan jenis data yang berbeda, mungkin tidak dapat ditransmisikan, bukan jenis yang benar-benar ditransmisikan antara klien dan server. Ada kemungkinan juga bahwa jenis aplikasi memanipulasi dapat tidak diketahui pada saat kompilasi MIDL. Ketika Anda memilih jenis yang dapat ditransmisikan dengan baik, Anda tidak perlu khawatir tentang representasi data di lingkungan heterogen. Atribut [represent_as] dapat membuat aplikasi Anda lebih efisien dengan mengurangi jumlah data yang dikirimkan melalui jaringan.

Atribut [represent_as] mirip dengan atribut [ transmit_as]. Namun, sementara [transmit_as] memungkinkan Anda menentukan jenis data yang akan digunakan untuk transmisi, [represent_as] memungkinkan Anda menentukan bagaimana jenis data diwakili untuk aplikasi. Jenis yang diwakili tidak perlu didefinisikan dalam file yang diproses MIDL; itu dapat didefinisikan pada saat stub dikompilasi dengan pengkompilasi C. Untuk melakukan ini, gunakan direktif sertakan dalam file konfigurasi aplikasi (ACF) untuk mengkompilasi file header yang sesuai. Misalnya, ACF berikut mendefinisikan jenis lokal ke aplikasi, repr_type, untuk jenis yang dapat ditransmisikan named_type:

typedef [represent_as(repr_type) [, type_attribute_list] named_type;

Tabel berikut menjelaskan empat rutinitas yang disediakan programmer.

Rutin Deskripsi
named_type_from_local Mengalokasikan instans jenis jaringan dan mengonversi dari jenis lokal ke jenis jaringan.
named_type_to_local Mengonversi dari jenis jaringan ke jenis lokal.
named_type_free_local Membebaskan memori yang dialokasikan oleh panggilan ke rutinitas named_type_to_local , tetapi bukan jenisnya sendiri.
named_type_free_inst Mengosongkan penyimpanan untuk jenis jaringan (kedua sisi).

 

Selain oleh empat rutinitas yang disediakan programmer ini, jenis bernama tidak dimanipulasi oleh aplikasi. Satu-satunya jenis yang terlihat oleh aplikasi adalah jenis yang diwakili. Aplikasi ini menggunakan nama jenis yang diwakili alih-alih nama jenis yang ditransmisikan dalam prototipe dan stub yang dihasilkan oleh pengkompilasi. Anda harus menyediakan serangkaian rutinitas untuk kedua belah pihak.

Untuk objek named_type sementara, stub akan memanggil named_type_free_inst untuk membebaskan memori apa pun yang dialokasikan oleh panggilan ke named_type_from_local.

Jika jenis yang diwakili adalah penunjuk atau berisi penunjuk, rutinitas named_type_to_local harus mengalokasikan memori untuk data tempat pointer menunjuk (objek jenis yang diwakili itu sendiri dimanipulasi oleh rintangan dengan cara biasa). Untuk parameter [ out] dan [ in, out] dari jenis yang berisi [represent_as atau salah satu komponennya, rutinitas named_type_free_local secara otomatis dipanggil untuk objek data yang berisi atribut . Untuk parameter [in ], rutinitas named_type_free_local dipanggil hanya jika atribut [represent_as] telah diterapkan ke parameter . Jika atribut telah diterapkan ke komponen parameter, *rutinitas _free_local tidak dipanggil. Membebaskan rutinitas tidak dipanggil untuk data yang disematkan dan panggilan paling sekali (terkait dengan atribut tingkat atas) untuk parameter [in] saja.

Catatan

Dimungkinkan untuk menerapkan atribut [transmit_as] dan [represent_as] ke jenis yang sama. Saat marshaling data, konversi jenis [represent_as] diterapkan terlebih dahulu lalu konversi [transmit_as] diterapkan. Urutan dibalik saat membatalkan nama data. Dengan demikian, saat marshaling, *_from_local mengalokasikan instans jenis bernama dan menerjemahkannya dari objek jenis lokal ke objek jenis bernama sementara. Objek ini adalah objek jenis yang disajikan yang digunakan untuk rutinitas *_to_xmit . Rutinitas *_to_xmit kemudian mengalokasikan objek jenis yang ditransmisikan dan menerjemahkannya dari objek yang disajikan (bernama) ke objek yang ditransmisikan.

 

Array bilangan bulat panjang dapat digunakan untuk mewakili daftar tertaut. Dengan cara ini, aplikasi memanipulasi daftar, dan transmisi menggunakan array bilangan bulat panjang ketika daftar jenis ini ditransmisikan. Anda dapat memulai dengan array, tetapi menggunakan konstruksi dengan array terbuka bilangan bulat panjang lebih nyaman. Contoh berikut menunjukkan cara melakukannya.

/* 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;

Perhatikan bahwa prototipe rutinitas yang menggunakan jenis LONGARR benar-benar ditampilkan dalam file Stub.h sebagai PLOC_BOX menggantikan jenis LONGARR . Hal yang sama berlaku untuk stub yang sesuai dalam file Stub_c.c.

Anda harus menyediakan empat fungsi berikut:

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 );

Rutinitas yang ditunjukkan di atas melakukan hal berikut:

  • Rutinitas LONGARR_from_local menghitung simpul daftar, mengalokasikan objek LONGARR dengan sizeof(LONGARR) + Count*sizeof(long), mengatur bidang Ukuran ke Hitungan, dan menyalin data ke bidang DataArr.
  • Rutinitas LONGARR_to_local membuat daftar dengan simpul Ukuran dan mentransfer array ke simpul yang sesuai.
  • Rutinitas LONGARR_free_inst tidak membebaskan apa pun dalam hal ini.
  • Rutinitas LONGARR_free_local membebaskan semua simpul daftar.