Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Создание класса Клиент-Сервер для обмена сообщениями через именованные каналы в Delphi

Delphi , ОС и Железо , Windows

Именованные каналы (named pipes) в Windows предоставляют надежный механизм для обмена данными между процессами и службами. В данной статье мы рассмотрим, как создать собственный класс Клиент-Сервер для работы с именованными каналами в среде разработки Delphi.

Проблема обмена сообщениями через именованные каналы

При разработке собственного класса Клиент-Сервер для обмена сообщениями через именованные каналы может возникнуть ряд проблем, особенно если речь идет о взаимодействии с сервисными приложениями. Одна из таких проблем заключается в том, что после получения одного сообщения от клиента сервер не может больше использовать функцию PeekNamedPipe(), получая сообщение об ошибке, что "на другом конце канала находится процесс". После закрытия клиентского приложения сервер получает сообщение о том, что канал закрывается, и не может восстановить связь с клиентом.

Решение проблемы

Исследования показали, что для корректной работы с именованными каналами необходимо использовать функции ConnectNamedPipe() после PeekNamedPipe() и DisconnectNamedPipe() после выполнения операций. Это позволяет освободить процессы и корректно управлять состоянием канала.

Учет изменений безопасности в Windows Vista и Seven

С выпуском Windows Vista и Seven были введены новые политики безопасности, влияющие на работу с именованными каналами. В частности, необходимо настроить параметры безопасности, чтобы обеспечить корректное взаимодействие между клиентом и сервисом.

Пример кода для создания именованного канала

Для создания именованного канала в Delphi можно использовать следующий код:

В отправителе (Sender unit):

procedure TForm1.FormCreate(Sender: TObject);
var
   FSA: SECURITY_ATTRIBUTES;
   FSD: SECURITY_DESCRIPTOR;
   pch1: ShortString;
begin
   InitializeSecurityDescriptor(@FSD, SECURITY_DESCRIPTOR_REVISION);
   SetSecurityDescriptorDacl(@FSD, True, nil, False);
   FSA.lpSecurityDescriptor := @FSD;
   FSA.nLength := SizeOf(SECURITY_ATTRIBUTES);
   FSA.bInheritHandle := True;

   Pipe := CreateNamedPipe(PChar('\.\pipe\<test>'),
                           PIPE_ACCESS_DUPLEX or FILE_FLAG_WRITE_THROUGH,
                           PIPE_TYPE_MESSAGE or PIPE_READMODE_MESSAGE or PIPE_NOWAIT,
                           PIPE_UNLIMITED_INSTANCES,
                           1024,
                           1024,
                           50,
                           @FSA);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
   buffer: ShortString;
   dw: DWORD;
   b1: Boolean;
begin
   buffer := Edit2.Text;
   WriteFile(Pipe, buffer, Length(buffer), dw, nil);
end;

В получателе (Receiver unit):

procedure TForm1.FormCreate(Sender: TObject);
var
   FSA: SECURITY_ATTRIBUTES;
   FSD: SECURITY_DESCRIPTOR;
begin
   InitializeSecurityDescriptor(@FSD, SECURITY_DESCRIPTOR_REVISION);
   SetSecurityDescriptorDacl(@FSD, True, nil, False);
   FSA.lpSecurityDescriptor := @FSD;
   FSA.nLength := SizeOf(SECURITY_ATTRIBUTES);
   FSA.bInheritHandle := True;

   Pipe := CreateFile(PChar('\.\pipe\<test>'),
                      GENERIC_READ or GENERIC_WRITE,
                      0,
                      @FSA,
                      OPEN_EXISTING,
                      0,
                      0);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
   buffer: ShortString;
   dw: DWORD;
begin
   ReadFile(Pipe, buffer, SizeOf(buffer), dw, nil);
   Edit1.Text := buffer;
end;

Заключение

В данной статье мы рассмотрели основные моменты, которые необходимо учитывать при работе с именованными каналами в Delphi, включая примеры кода для создания и использования таких каналов. Следуя этим рекомендациям, вы сможете успешно реализовать собственный класс Клиент-Сервер для обмена сообщениями между процессами и службами в Windows.

Создано по материалам из источника по ссылке.

Создание класса Клиент-Сервер для обмена сообщениями через именованные каналы в Delphi с учетом особенностей работы с этими каналами и изменений в безопасности Windows Vista и Seven.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Windows ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-07-30 12:19:40/0.0074191093444824/1