

| стрелялки |
| спорт |
| драки |
| стратегии |
| гонки |
| логические |
| азартные |
| аркады |
| эротические |
| фильмы онлайн |
| Подключение к именованному каналу клиентского приложения |
|
Клиентское приложение не столь чопорно, как сервер именованных каналов, и поэтому может создаваться в любой 32-разрядной версии Windows. Подключение клиента к каналу осуществляется либо методом FileCreate(), либо при помощи метода CallNamedPipe(). Первый вариант подходит в ситуациях, когда по каналу предполагается передавать поток байт, второй - когда канал специализируется на работе с сообщениями. Если канал свободен, метод возвращает дескриптор канала. Если канал занят, клиентское приложение имеет право подождать освобождения канала, но для этого потребуется вызвать метод WaitNamedPipe(). Рассмотрим пример применения метода FileCreate(): function ConnectToBytePipe(const PipeName: string; var hPipe: THandle): Cardinal; begin hPipe:=FileCreate(PipeName); //передаем в параметр наименование канала Result:=CARDINAL(GetLastError()); if Result>0 then begin {действия, если канал отсутствует, занят и т.п.} //... MessageBox(frmMain.Handle, PChaKFormatCGwa^/od'+JflS+Tos', [ErrorCod, SysErrorMessage(ErrorCod)])), PChar('Gшибка'), MB_ICONERROR+MB_OK); end; end; После попытки получить дескриптор канала с именем PipeName метод обязательно проверяет код последней ошибки. Если метод GetLastError() вернул значение, отличное от нуля, т. е. произошла какая-то ошибка, мы извещаем об этом пользователя сообщением, а код ошибки возвращаем в качестве результата выполнения всей функции. ОЕсли именованный канал создан с применением ключа PIPE_TYPE_MESSAGE и соответственно по нему передаются отдельные сообщения, то для соединения с каналом вместо метода FileCreate() клиентское приложение должно применять метод CallNamedPipe(). При попытке вызвать этот метод для соединения с каналом, специализирующимся на передаче потока байт, функция возвратит сообщение об ошибке. Метод CallNamedPipe() подключается к именованному каналу, при необходимости ждет его освобождения, осуществляет единовременную операцию чтения и записи и отключается от канала. function CallNamedPipe(PipeName : pAnsiChar; InBuffer : Pointer; InBufferSize : Cardinal; OutBuffer : Pointer; OutBufferSize : Cardinal; var BytesRead : Cardinal; TimeOut : Cardinal) : boolean. |
