Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

[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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.58 MB
Время: 0.072 c
15-1330245287
stas
2012-02-26 12:34
2013.03.22
Помогите настроить роутер микротик


2-1331014601
DevilDevil
2012-03-06 10:16
2013.03.22
Помогите то ли с куки, то ли с переадресацией


2-1332675320
Pcrepair
2012-03-25 15:35
2013.03.22
Парсинг текста и использование рег.выражений?


2-1328186097
Ega23
2012-02-02 16:34
2013.03.22
Добавить в DBGrid колонки


8-1226815309
CodeMaster
2008-11-16 09:01
2013.03.22
Fade





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский