Какой-то источник, который реализует коммуникацию между приложениями именованных каналов или помощь в этом - PullRequest
1 голос
/ 04 февраля 2011

Я реализую свой собственный класс Client / Server по именованным каналам, но у меня слишком много проблем и мало информации в интернете.Я уже нашел много реализаций с каналами, но с приложением vlc, но я работаю с сервисными приложениями.

Я принимаю подсказки о том, как работать с каналами.

Моя настоящая проблема заключается в следующем: хотя сервер и приложение только получают одно сообщение от клиента, после этого мой сервер не может использовать PeekNamedPipe) большеМое сообщение об ошибке, которое я получаю от GetLastError: «На другом конце канала есть процесс», но .... Я не знаю, что с этим делать.Если я закрываю клиентское приложение, я получаю сообщение «Канал закрывается», и после этого я не могу установить связь с клиентом.

tks

Ответы [ 3 ]

3 голосов
/ 04 февраля 2011

оооо я нашел проблему. Я читал некоторые статьи о Windows, и я обнаружил, что я должен подключиться к именованному каналу, используя after peek и after connect. Это имеет смысл.

ConnectNamedPipe (FPipeHandle, ноль) и после PeekNamedPipe (FPipeHandle, ноль, 0, ноль, @LBytesSize, ноль)

И после выполнения моей операции я должен вызвать DisconnectNamedPipe (FPipeHandle); Чтобы освободить процесс.

ТКС

1 голос
/ 05 февраля 2011

Если у вас есть пример кода, обратите внимание на компоненты GUI, которые вам нужно будет создать в форме:

Единица отправителя:

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, sizeof(buffer), dw, nil);
end;

Приемное устройство:

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;

надеюсь, это поможет.

1 голос
/ 04 февраля 2011

Думаю, у вас возникнут проблемы при запуске приложения в Vista или Seven.

В XP нет проблем со связью между сервисом и клиентским приложением.

Но «благодаря» новой политике контроля учетных записей и безопасности, введенной в Vista и Seven, вам необходимо установить некоторые параметры безопасности.

См. , что я узнал во время реализации и тестирования нашей платформы с открытым исходным кодом.

У вас есть рабочий пример взаимодействия клиента и сервера Named Pipe, также протестированный на сервере, работающем в качестве службы, в нашем хранилище исходного кода .

...