Bagikan melalui


Menentukan Pipa dalam File IDL

Ketika pipa didefinisikan dalam file IDL, pengkompilasi MIDL menghasilkan struktur kontrol pipa yang anggotanya adalah penunjuk untuk mendorong, menarik, dan mengalokasikan prosedur serta variabel status yang mengoordinasikan prosedur ini. Aplikasi klien menginisialisasi bidang dalam struktur kontrol pipa, mempertahankan variabel statusnya, dan mengelola transfer data dengan fungsi dorong, tarik, dan alokasinya sendiri. Kode stub klien memanggil fungsi aplikasi ini dalam perulangan selama transfer data. Untuk pipa input, stub klien membasahkan data transfer dan mengirimkannya ke stub server. Untuk pipa output, klien membasmi data menjadi buffer dan meneruskan pointer ke buffer tersebut kembali ke aplikasi klien.

Kode stub server menginisialisasi bidang struktur kontrol pipa ke variabel status, serta pointer untuk mendorong dan menarik rutinitas. Stub server mempertahankan status dan mengelola penyimpanan privatnya untuk data transfer. Aplikasi server memanggil rutinitas penarikan dan pendorongan dalam perulangan selama panggilan prosedur jarak jauh saat menerima dan membatalkan nama data dari stub klien, atau marshal dan mengirimkan data ke rintian klien.

Contoh file IDL berikut mendefinisikan jenis pipa LONG_PIPE, yang ukuran elemennya didefinisikan selama. Ini juga menyatakan prototipe fungsi untuk prosedur jarak jauh memanggil InPipe dan OutPipe, untuk mengirim dan menerima data, masing-masing. Ketika pengkompilasi MIDL memproses file IDL, ia menghasilkan file header yang ditunjukkan dalam contoh.

Contoh

// File: pipedemo.idl
typedef pipe long LONG_PIPE;
void InPipe( [in] LONG_PIPE pipe_data );
void OutPipe( [out] LONG_PIPE *pipe_data ); 
//end pipedemo.idl
 
// File: pipedemo.h (fragment)
// Generated by the MIDL compiler from pipedemo.idl
typedef struct pipe_LONG_PIPE
{
    void (__RPC_FAR * pull) (
        char __RPC_FAR * state,
        long __RPC_FAR * buf,
        unsigned long esize,
        unsigned long __RPC_FAR * ecount );
    void (__RPC_FAR * push) (
        char __RPC_FAR * state,
        long __RPC_FAR * buf,
        unsigned long ecount );
    void (__RPC_FAR * alloc) (
        char __RPC_FAR * state,
        unsigned long bsize,
        long __RPC_FAR * __RPC_FAR * buf,
        unsigned long __RPC_FAR * bcount );
    char __RPC_FAR * state;
} LONG_PIPE;
 
void InPipe( 
    /* [in] */ LONG_PIPE pipe_data);
void OutPipe( 
    /* [out] */ LONG_PIPE __RPC_FAR *pipe_data);
//end pipedemo.h

Pipa

/Oi