Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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];
????


Наверх

Титульная страница Поиск, карта сайта Написать письмо