Определение каналов в IDL-файлах
При определении канала в IDL-файле компилятор MIDL создает структуру управления каналом, членами которой являются указатели на процедуры отправки, извлечения и выделения, а также переменную состояния, которая координирует эти процедуры. Клиентское приложение инициализирует поля в структуре управления каналом, поддерживает переменную состояния и управляет передачей данных с помощью собственных функций push, pull и alloc. Код заглушки клиента вызывает эти функции приложения в циклах во время передачи данных. Для входного канала заглушка клиента маршалирует передаваемые данные и передает их в заглушку сервера. Для выходного канала заглушка клиента отменяет перенос данных в буфер и передает указатель на этот буфер обратно клиентскому приложению.
Код заглушки сервера инициализирует поля структуры управления каналом переменной состояния, а также указатели на процедуры отправки и извлечения. Заглушка сервера поддерживает состояние и управляет своим частным хранилищем для передаваемых данных. Серверное приложение вызывает процедуры извлечения и отправки в циклы во время удаленного вызова процедуры, когда оно получает и отменяет удаление данных из клиентской заглушки или маршалирует и передает данные в заглушку клиента.
В следующем примере IDL-файла определяется тип канала LONG_PIPE, размер элемента которого определен как длинный. Он также объявляет прототипы функций для удаленных вызовов процедур InPipe и OutPipe для отправки и получения данных соответственно. Когда компилятор MIDL обрабатывает IDL-файл, он создает файл заголовка, показанный в примере.
Пример
// 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
Связанные темы