N
NetDigger
Здравствуйте, уважаемые! Помогите разобраться с 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;
Сервер
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;