![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ReadFile ! [D7, Win2k]
DoG © (2004-05-21 17:51:00)Здр !
У меня вот какая проблема !
Есть сервер там я создаю пайп CreateNamedPipe
И клиент там я этот пайп читаю
Как, прочитать этот же пайп на сервере, т.е. там же где он был создан ?
Вот так вот не получается.
if ReadFile(hPipe, ReadBuf, sizeof(ReadBuf), dd, nil) then
begin
st := ReadBuf;
ListBox2.Items.Add(st);
end;
LMD (2004-05-21 22:19:00) [1]
> а ты че не видешь умя здесь ни какой баги ?
Вижу целых две, первая: Ты не проверяешь результат операций и не видишь, где и почему происходит ошибка.
вторая: ты не дружишь с русским языком. Извини, хочешь нормального обсуждения, пиша грамотно.
DoG (2004-05-21 21:49:00) [2]Я нашел эту статью, прочитал...легче мне не стало !
Слушай LMD а ты че не видешь умя здесь ни какой баги ?
LMD (2004-05-21 21:37:00) [3]
> Хоть как называется !
Что такое Named Pipes и как с ними бороться.
Удачи!
DoG (2004-05-21 21:30:00) [4]что то я не нашел там такойс статьи ! Хоть как называется !
А че тут вобще у меня лес что ли?, на глаз то не видно где бага зарыта ?
LMD (2004-05-21 21:10:00) [5]В разделе "статьи" есть статья про пайпы.
Удачи!
DoG (2004-05-21 19:33:00) [6]СЕРВЕР:
function ReadPipe(params : dword): dword; stdcall;
var
ReadBuf: array [0..255] of Char;
st,st1: string;
dd : Dword;
i,j : integer;
begin
ZeroMemory(@ReadBuf, SizeOf(ReadBuf));
while true do
if ReadFile(hPipe, ReadBuf, sizeof(ReadBuf), dd, nil) then
begin
st := ReadBuf;
form1.ListBox2.Items.Add(st);
end;
sleep(100);
end;
end;
function WritePipe(void: pointer): dword; stdcall;
var
ReadBuf : array[0..255] of Char;
i : integer;
st : string;
dd : dword;
begin
while true do begin
if ConnectNamedPipe(hPipe,nil) then
while true do begin
sleep(100);
if struct then begin
ZeroMemory(@ReadBuf,SIZEOF(ReadBuf));
st:='$' ;
for i:=0 to Form1.ListBox1.Items.Count-1 do
st := st+Form1.ListBox1.Items[i]+'$';
for i:=1 to Length(st) do ReadBuf[i-1] := st[i];
OemToChar(ReadBuf, ReadBuf);
WriteFile(hPipe,ReadBuf,sizeof(ReadBuf),lpBuf,nil);
struct := false;
con:= true;
end;
end;
sleep(100);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
st: String ;
begin
st := '\\'+Edit1.Text+'\pipe\pipename';
hPipe := CreateNamedPipe(PChar(st),PIPE_ACCESS_DUPLEX or WRITE_DAC,PIPE_TYPE_Byte or PIPE_READMODE_Byte or PIPE_WAIT ,PIPE_UNLIMITED_INSTANCES,255,255,NMPWAIT_USE_DEFAULT_WAIT,Nil);
if hPipe=INVALID_HANDLE_VALUE then
ShowMessage('Error: '+SysErrorMessage(GetLastError))
else lbStat.Caption := 'Connect';
HNDwp := CreateThread(nil,0,@WritePipe,nil,0,IDw);
HNDrp := CreateThread(nil,0,@ReadPipe, nil ,0,IDr);
end;
КЛИЕНТ:
function ReadPipe(params : dword): dword; stdcall;
var
ReadBuf: array [0..255] of Char;
st,st1: string;
dd : Dword;
i,j : integer;
begin
ZeroMemory(@ReadBuf, SizeOf(ReadBuf));
while true do
begin
if (ReadFile(params, ReadBuf, sizeof(ReadBuf), dd, nil)) then
begin
st := ReadBuf;
if st[1]='$' then begin // ÏÐÈÅÌ ÑÒÐÓÊÒÓÐÛ ÔÀÉËÎÂ
i:=0; j:=0;
Form1.List1.Clear;
for i:=1 to Length(st) do
if (st[i]='$') and (Length(st)i) then begin
j:=i+1;
st1:='';
repeat
st1 := st1 + st[j] ;
inc(j);
until st[j]='$';
Form1.List1.Items.Add(st1);
end;
end;
st := 'hello';
for i:=1 to Length(st) do ReadBuf[i-1] := st[i];
OemToChar(ReadBuf, ReadBuf);
WriteFile(hPipe,ReadBuf,sizeof(ReadBuf),lpBuf,nil);
end;
sleep(100);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
st: string;
begin
st := '\\'+Edit1.Text +'\pipe\pipename' ;
hFile := CreateFile(PChar(st) , GENERIC_READ , FILE_SHARE_READ, Nil ,CREATE_NEW , FILE_ATTRIBUTE_NORMAL , 0);
if hFile=INVALID_HANDLE_VALUE then
ShowMessage('Error: '+SysErrorMessage(GetLastError))
else lbStat.Caption := 'Connect';
HNDrp := CreateThread(nil,0,@ReadPipe, pointer(hFile) ,0,IDr);
end;
Вначале сервак отправляет строку клиенту, тот принимает (ето работает), потом он должен отправить серваку HEllo а тот должен принять, вот тут что то не работает ! или не отправляет или не принимает или то и другое.
Причем при таком раскладе сервак отказывается отправлять строку, а вот если убрать у сервака нить на чтение то он все отправляет,
вот почему так ? и как сделать что бы можно было передавать в обе стороны ?
Black Krok (2004-05-21 18:12:00) [7]Надо вроде так:
if ReadFile(hPipe, ReadBuf[1], sizeof(ReadBuf), dd, nil) then
а ReadBuf описано очевидно как:
ReadBuf : string[X];
????