Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АОПИ. Старое / АОПИ. Глава 2. Конспекты (02_04_19).rtf
Скачиваний:
65
Добавлен:
10.09.2019
Размер:
363.46 Кб
Скачать

Функция объединения функций именованного канала

Объединяет функции, которые записывают сообщение и считывают сообщение из указанного именованного канала в одну сетевую операцию.

BOOL TransactNamedPipe(

HANDLE hNamedPipe,

LPVOID lpInBuffer,

DWORD nInBufferSize,

LPVOID lpOutBuffer,

DWORD nOutBufferSize,

LPDWORD lpBytesRead,

LPOVERLAPPED lpOverlapped,

);

Параметры и описание:

(1) lpNamedPipeName — определяет дескриптор именованного канала, возвращаемый функцией CreateNamedPipe или CreateFile. Этот параметр также может быть дескриптором анонимного канала, возвращаемого функцией CreatePipe.

(2) lpInBuffer — определяет указатель на буфер, содержащий данные для записи в канал.

(3) nInBufferSize — определяет размер входного буфера, в байтах.

(4) lpOutBuffer — определяет указатель на буфер, который получает данные, прочитанные из канала.

(5) nOutBufferSize — определяет размер выходного буфера в байтах.

(6) lpBytesRead — определяет указатель на переменную, которая получает количество байтов, прочитанных из канала.

Если lpOverlapped имеет значение NULL, lpBytesRead не может быть NULL.

Если lpOverlapped не NULL, lpBytesRead может быть NULL. Если это перекрывающаяся операция чтения, вы можете получить количество прочитанных байтов, вызвав GetOverlappedResult. Если hNamedPipe связан с портом завершения ввода / вывода, вы можете получить количество прочитанных байтов, вызвав GetQueuedCompletionStatus.

(7) lpOverlapped — определяет указатель на перекрытую структуру. Эта структура требуется, если hNamedPipe был открыт с помощью FILE_FLAG_OVERLAPPED.

Если hNamedPipe был открыт с FILE_FLAG_OVERLAPPED, параметр lpOverlapped не должен быть NULL. Он должен указывать на действительную структуру OVERLAPPED.

Если hNamedPipe был создан с FILE_FLAG_OVERLAPPED и lpOverlapped имеет значение NULL, функция может неправильно сообщить о завершении операции.

Если hNamedPipe был открыт с FILE_FLAG_OVERLAPPED и lpOverlapped не равен NULL, TransactNamedPipe выполняется как перекрывающаяся операция. Структура OVERLAPPED должна содержать объект события с ручным сбросом (который может быть создан с помощью функции CreateEvent).

Если операция не может быть завершена немедленно, TransactNamedPipe возвращает FALSE, а GetLastError возвращает ERROR_IO_PENDING. В этой ситуации объект события устанавливается в состояние без сигнала перед возвратом TransactNamedPipe, и он устанавливается в состояние сигнала после завершения транзакции. Кроме того, вы можете получить уведомление о завершении перекрытой операции с помощью функций GetQueuedCompletionStatus или GetQueuedCompletionStatusEx. В этом случае вам не нужно присваивать событие ручного сброса в структуре OVERLAPPED, и завершение происходит с hNamedPipe так же, как и при асинхронной операции чтения или записи.

Если hNamedPipe не был открыт с FILE_FLAG_OVERLAPPED, TransactNamedPipe не вернется, пока операция не будет завершена.

Возвращаемое значение.

Если функция завершается успешно, возвращаемое значение равно TRUE.

Если функция завершается ошибкой, возвращаемое значение равно FALSE.

Если сообщение для чтения длиннее буфера, указанного в параметре nOutBufferSize, TransactNamedPipe возвращает FALSE, а функция GetLastError возвращает ERROR_MORE_DATA. Оставшаяся часть сообщения может быть прочитана последующим вызовом ReadFile, ReadFileEx или PeekNamedPipe.