Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

[named pipes] Как?   Найти похожие ветки 

 
Сергей М. ©   (2012-05-11 23:21) [40]


> в логах якобы он это в канал плюёт


Так он же вовсе не обязан "плевать" юникодом)
Может он ansi-текст выплевывает)...


 
vegarulez   (2012-05-11 23:25) [41]

может быть... как тогда мне его привести в требуемый вид???

Вот кусок начинаю чтение

 while true do begin
   rc := ReadFile (hPipe^, inBuf, IN_BUF_SIZE*sizeof(WideChar), bytesRead,
     @OverLapRd);    // перменная булеан , пытаемся прочитать из pipe

   if not rc then begin
     lastError := GetLastError;
     // Проверка на три вида ошибки:
     // IO_PENDING (ожидать завершения операции), BROKEN_PIPE (выйти из цикла)
     // и остальные (выдать сообщение, выйти из цикла и умереть)
     if lastError = ERROR_IO_PENDING then begin
       WaitForSingleObject (hEventRd, INFINITE);
     end else begin
       if lastError = ERROR_BROKEN_PIPE then
         MessageBoxW (hWndClient,
           "The connection to this client has been broken.", "", MB_OK)
       else
         ShowLastErrorMessage(hWndClient,
           PAnsiChar("Client: Debug():ReadFile"));
       Break;
     end;
   end;
   GetOverlappedResult (hPipe^, OverLapRd, bytesTrans, false);
   inBuf[bytesTrans div SizeOf(WideChar)] := #0; // Завершить полученную строку

   SendMessageW (GetDlgItem (hWndClient, IDD_EDITREAD), EM_REPLACESEL,
     0, LPARAM(@inBuf));
   // Перевести курсор на следующую строку в элементе редактирования :)
   SendMessageW (GetDlgItem (hWndClient, IDD_EDITREAD), EM_REPLACESEL,
     0, LPARAM(PWideChar(CrLf)));

   s:="";
   for i:=0 to Length(inBuf)-1 do
    s:=s+utf8decode(inBuf[i]);
   Form1.Memo2.Lines.Add(s);
   Form1.Memo2.Lines.Add(CrLf);

   Form1.Memo2.Lines.Add(inBuf);
   Form1.Memo2.Lines.Add(CrLf);



и помешаю в мемо. Как привести ansi к читабельному виду?


 
vegarulez   (2012-05-11 23:28) [42]

Сергей М. ©   (11.05.12 23:19) [39]

ну имеется ввиду сервер из тестового примера.
Да это совсем другой сервер и совсем другая песня. мне нужен был именнованый канал - т.к. по нему идёт обмен данными. Поискал в инете - нашёл стсатью и описание с примерами - вот взял пример и  пытаюсь клиента прикруть на другой сервер. Ты абсолютно прав.


 
Сергей М. ©   (2012-05-11 23:35) [43]


> имеется ввиду сервер из тестового примера


Нам отсюда не видно что там за сервер и из какого тестового примера.


> Как привести ansi к читабельному виду?


Так ты сначала выясни анси там на самом деле или не анси ..
Если анси, то нахрена его принимать в юникодовом виде и потом героически преодолевать проблемы ?


 
vegarulez   (2012-05-11 23:40) [44]

Я не знаю в каком виде тот сервер выплёвывает данные - это чёрный ящик так сказать... я лиш знаю что это плоский текст в формате xml в кодировке windows-1251


 
vegarulez   (2012-05-11 23:43) [45]

я ему отправляю запрос тоже в xml - и программисты с сервера смотря логи - говорят ну да ваш запрос успешно дошёл - сервер вам успешно ответил. ответ я приводил выше. приведу ещё раз:

<Acv version="3.04">
              <file>
                             <reqReadfile/>
              </file>
</Acv>

но я не знаю в анси он или юникоде.
подскажи как мне его попробовать прочитать в анси?


 
Сергей М. ©   (2012-05-11 23:47) [46]


> в кодировке windows-1251


Так ведь Win-1251 - это однобайтный код !
Какого же тогда лешего, зная это, ты пытаешься его трактовать как 2-байтный ?)


 
Сергей М. ©   (2012-05-11 23:50) [47]


> как мне его попробовать прочитать в анси?


Анси - однобайтный код.


 
vegarulez   (2012-05-11 23:54) [48]

спасибо за ликбез - почитаю статьи на эти темы - чтобы ликвидировать без грамотность. никогда просто обычно не сталкивался...
подскажи тогда как мне его правильно прочесть?
по идее чтение в inBuf  идёт вот тут:
ReadFile (hPipe^, inBuf, IN_BUF_SIZE*sizeof(WideChar), bytesRead,
     @OverLapRd);

что требуется изменить для правильного чтения?


 
vegarulez   (2012-05-11 23:55) [49]

ReadFile (hPipe^, inBuf, IN_BUF_SIZE*sizeof(AnsiChar), bytesRead,
     @OverLapRd);


так?


 
Сергей М. ©   (2012-05-11 23:59) [50]


>      // Сообщить серверу свое имя
>      ClntName[0]:="A";

ClntName - это у тебя и в случае с "тестовым сервером" (который отвечает в win1251) тоже юникодовый буфер ?

Стремный какой-то сервер - запросы ждет в юникоде, а ответы посылает в ansi win1251 ..


 
Сергей М. ©   (2012-05-12 00:03) [51]


> vegarulez   (11.05.12 23:55) [49]


Сам буфер объяви как array[...] of AnsiChar.

Тогда


> ReadFile (hPipe^, inBuf, sizeof(inBuf),


 
vegarulez   (2012-05-12 00:33) [52]

попробовал... что-то вообще пусто в буфере... даже вопросиков нет (


 
Германн ©   (2012-05-12 00:57) [53]


> попробовал... что-то вообще пусто в буфере... даже вопросиков
> нет (
>

Покажи исправленный код.


 
vegarulez   (2012-05-12 08:13) [54]

var
 inBuf: array[0..IN_BUF_SIZE] of AnsiChar;
 bytesRead: DWORD;
 rc: Boolean;
 lastError: DWORD;
 hEventRd: THANDLE;
 OverLapRd: OVERLAPPED;
 bytesTrans: DWORD;
 s:ansistring;
 i:integer;
begin
 inBuf[0] := #0;
 hEventRd := CreateEventW (nil, true, false, nil);
 FillChar (OverLapRd, sizeof(OVERLAPPED), 0);
 OverLapRd.hEvent := hEventRd;
 // Бесконечный цикл чтения из канала, до тех пор,пока не разорвется соединение
 // Чтение происходит асинхронно, с ожиданием по событию. После того, как сооб-
 // щение прочитано, оно помещается в элемент редактирования.
 while true do begin
   rc := ReadFile (hPipe^, inBuf, sizeof(inBuf), bytesRead,
     @OverLapRd);    // перменная булеан , пытаемся прочитать из pipe

   if not rc then begin
     lastError := GetLastError;
     // Проверка на три вида ошибки:
     // IO_PENDING (ожидать завершения операции), BROKEN_PIPE (выйти из цикла)
     // и остальные (выдать сообщение, выйти из цикла и умереть)
     if lastError = ERROR_IO_PENDING then begin
       WaitForSingleObject (hEventRd, INFINITE);
     end else begin
       if lastError = ERROR_BROKEN_PIPE then
         MessageBoxW (hWndClient,
           "The connection to this client has been broken.", "", MB_OK)
       else
         ShowLastErrorMessage(hWndClient,
           PAnsiChar("Client: Debug():ReadFile"));
       Break;
     end;
   end;
   GetOverlappedResult (hPipe^, OverLapRd, bytesTrans, false);
   inBuf[bytesTrans div SizeOf(inBuf)] := #0; // Завершить полученную строку

   SendMessageW (GetDlgItem (hWndClient, IDD_EDITREAD), EM_REPLACESEL,
     0, LPARAM(@inBuf));
   // Перевести курсор на следующую строку в элементе редактирования :)
   SendMessageW (GetDlgItem (hWndClient, IDD_EDITREAD), EM_REPLACESEL,
     0, LPARAM(PWideChar(CrLf)));

   s:="";
   Form1.Memo2.Lines.Add(inttostr(Length(inBuf)));
   for i:=0 to Length(inBuf)-1 do
    s:=s+(inBuf[i]);
   Form1.Memo2.Lines.Add(s);
   Form1.Memo2.Lines.Add(CrLf);

   Form1.Memo2.Lines.Add(inBuf);
   Form1.Memo2.Lines.Add(CrLf);
 end;
 // Если соединение с каналом разорвано, завершить программу
 PostMessageW (hWndClient, WM_GO_AWAY, 0,0);
 ExitThread(0);
end;


 
Сергей М. ©   (2012-05-12 11:39) [55]


>  inBuf[bytesTrans div SizeOf(inBuf)] := #0; // Завершить
> полученную строку


А это что за выкрутасы ?
Ты вообще контролировал значение bytesTrans после GetOverlappedResult ?


 
vegarulez   (2012-05-12 22:43) [56]

Сергей М. ©   (12.05.12 11:39) [55]
аха - убрал - всё заработало... сейчас потестирую... скорее всего вопросы ещё появяться. Спасибо большое!
з.ы. сок\ пиво  нужное подчеркнуть - могу эквивалент на телефон.

честно говоря - для меня пока тёмный лес. Поэтому не контролировал. Всё с примера взято, делфимастера. Я так понимаю... что строка зануляла все элементы массива. только не совсем понятно она занулаля типа элемент в массиве inbuf, который высчитывался как количество переданных байт разделить на размер inbuf. я не понимаю суть этого действия ((


 
Германн ©   (2012-05-13 03:55) [57]


> честно говоря - для меня пока тёмный лес. Поэтому не контролировал.

Опять "метод ненаучного тыка".
Протокол общения с сервером кто должен знать? Ты или Пушкин?


 
Сергей М. ©   (2012-05-13 22:57) [58]


> я не понимаю суть этого действия


Нашиша тогда выполнял это действие ?)


 
AdeptLife ©   (2012-05-25 11:51) [59]

vegarulez.
Судя по описанию я сейчас столкнулся с подобной задачей: обмен с сервером через именованный канал xml запросами.
Выложи, пожалуйста, исходники или скинь на адрес adeptlife@mail.ru.
Буду очень признателен. Заранее огромное спасибо.



Страницы: 1 2 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.59 MB
Время: 0.06 c
2-1346842080
NoUserName
2012-09-05 14:48
2013.03.22
Регистрация расширения файла


15-1342778707
Юрий Зотов
2012-07-20 14:05
2013.03.22
Наш ответ


6-1261756160
Kain
2009-12-25 18:49
2013.03.22
Реализация мультиплексирования


2-1346616136
ankazh
2012-09-03 00:02
2013.03.22
Сводная таблица


15-1336994384
AV
2012-05-14 15:19
2013.03.22
Copy команда. Как не затирать без вопросов?