Форум: "Начинающим";
Текущий архив: 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.57 MB
Время: 0.1 c