Здравствуйте, уважаемые! Помогите разобраться с Named Pipes. Сделал простенькую программу - сервер и клиент. Сервер - окно с кнопарем CreateServer и клиент - с двумя Едитами и кнопарями Send и Receive. Запускаю сервер, нажимаю Create, запускаю клиент, набирают в одном Edit'е текст, жму на Send, затем на Receive - виснет клиент. Стоит закрыть сервер, вылетает ошибка(на клиенте), что типа не могу прочесть из канала ( ReadFile возвращает False) - чего только не перепробовал - не получается. Исходники: Сервер
Код | HP := CreateNamedPipe( '\\.\PIPE\test', PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE or PIPE_READMODE_BYTE or PIPE_NOWAIT, 255, 1000*SizeOf(AnsiChar), 1000*SizeOf(AnsiChar), 0, nil ); If HP = INVALID_HANDLE_VALUE then Begin ShowMessage('Cannot create pipe!'); Halt; End;
|
Клиент
Код |
Var HPipe: Thandle;
procedure TForm1.Button1Click(Sender: TObject); var res: Boolean; BytesWrt: DWORD; BytesRd: DWORD; len : DWORD; begin HPipe := CreateFile( '\\.\Pipe\test', GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0 ); If HPipe = INVALID_HANDLE_VALUE then begin ShowMessage('Cannot create file!'); halt; End;
Messag := PAnsiChar(Edit1.Text + #0); Len := Length( Messag) * SizeOf(AnsiChar) + 1; res := WriteFile( Hpipe, Messag^, Len, BytesWrt, nil ); If not(res) then Begin ShowMessage('Cannot write to pipe!'); halt; End;
end;
procedure TForm1.Button2Click(Sender: TObject); var res: Boolean; BytesRd: DWORD; InBuf: Array[0..512] of AnsiChar; Begin
InBuf[0] := #0; Res := ReadFile( hPipe, InBuf, 512, BytesRd, nil ); If not(res) then Begin ShowMessage('Cannot read from pipe!'); halt; End Else ShowMessage( StrPas( InBuf ) );
closeHandle( HPipe );
end;
|
|