![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
[named pipes] Как? [D7, XP]
vegarulez © (2012-04-24 00:26:00)Всем дорбого времени суток!
Уважаемые мастреа, подскажите как сделать тоже самое что написано в статье
http://www.delphimaster.ru/articles/named_pipes/index.html
только в обычном окне на форме - чтобы при нажатии кнопки на форме происходил коннект к именованному каналу а при нажатии другой кнопки происходила отправка данных в канал к примеру из мемо1 и чтение ответа к примеру в мемо2. Прочитав пример - и запустив приложение которе прилагается к статье - понял что это то что нужно. но вот не задача - там всё сделано на диалоговом окне как я понимаю... и у меня не хватает знаний чтобы перенести это всё на форму [тут он краснеет потупив взгляд в пол], там очень много непонятных мне моментов. Прошу помочь с переносом на обычную форму.
AdeptLife (2012-05-25 11:51:00) [1]vegarulez.
Судя по описанию я сейчас столкнулся с подобной задачей: обмен с сервером через именованный канал xml запросами.
Выложи, пожалуйста, исходники или скинь на адрес adeptlife@mail.ru.
Буду очень признателен. Заранее огромное спасибо.
Сергей М. (2012-05-13 22:57:00) [2]
> я не понимаю суть этого действия
Нашиша тогда выполнял это действие ?)
Германн (2012-05-13 03:55:00) [3]
> честно говоря - для меня пока тёмный лес. Поэтому не контролировал.
Опять "метод ненаучного тыка".
Протокол общения с сервером кто должен знать? Ты или Пушкин?
vegarulez (2012-05-12 22:43:00) [4]Сергей М. © (12.05.12 11:39) [55]
аха - убрал - всё заработало... сейчас потестирую... скорее всего вопросы ещё появяться. Спасибо большое!
з.ы. сок\ пиво нужное подчеркнуть - могу эквивалент на телефон.
честно говоря - для меня пока тёмный лес. Поэтому не контролировал. Всё с примера взято, делфимастера. Я так понимаю... что строка зануляла все элементы массива. только не совсем понятно она занулаля типа элемент в массиве inbuf, который высчитывался как количество переданных байт разделить на размер inbuf. я не понимаю суть этого действия ((
Сергей М. (2012-05-12 11:39:00) [5]
> inBuf[ bytesTrans div SizeOf(inBuf)] := #0; // Завершить
> полученную строку
А это что за выкрутасы ?
Ты вообще контролировал значение bytesTrans после GetOverlappedResult ?
vegarulez (2012-05-12 08:13:00) [6]
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 00:57:00) [7]
> попробовал... что-то вообще пусто в буфере... даже вопросиков
> нет (
>
Покажи исправленный код.
vegarulez (2012-05-12 00:33:00) [8]попробовал... что-то вообще пусто в буфере... даже вопросиков нет (
Сергей М. (2012-05-12 00:03:00) [9]
> vegarulez (11.05.12 23:55) [49]
Сам буфер объяви как array[...] of AnsiChar.
Тогда
> ReadFile (hPipe^, inBuf, sizeof(inBuf),
Сергей М. (2012-05-11 23:59:00) [10]
> // Сообщить серверу свое имя
> ClntName[0]:='A';
ClntName- это у тебя и в случае с "тестовым сервером" (который отвечает в win1251) тоже юникодовыйбуфер ?
Стремный какой-то сервер - запросы ждет в юникоде, а ответы посылает в ansi win1251 ..
vegarulez (2012-05-11 23:55:00) [11]
ReadFile (hPipe^, inBuf, IN_BUF_SIZE*sizeof( AnsiChar), bytesRead,
@OverLapRd);
так?
vegarulez (2012-05-11 23:54:00) [12]спасибо за ликбез - почитаю статьи на эти темы - чтобы ликвидировать без грамотность. никогда просто обычно не сталкивался...
подскажи тогда как мне его правильно прочесть?
по идее чтение в inBuf идёт вот тут:
ReadFile (hPipe^, inBuf, IN_BUF_SIZE*sizeof(WideChar), bytesRead,
@OverLapRd);
что требуется изменить для правильного чтения?
Сергей М. (2012-05-11 23:50:00) [13]
> как мне его попробовать прочитать в анси?
Анси - однобайтный код.
Сергей М. (2012-05-11 23:47:00) [14]
> в кодировке windows-1251
Так ведь Win-1251 - это однобайтныйкод !
Какого же тогда лешего, зная это, ты пытаешься его трактовать как 2-байтный ?)
vegarulez (2012-05-11 23:43:00) [15]я ему отправляю запрос тоже в xml - и программисты с сервера смотря логи - говорят ну да ваш запрос успешно дошёл - сервер вам успешно ответил. ответ я приводил выше. приведу ещё раз:
<Acv version="3.04">
<file>
<reqReadfile/>
</file>
</Acv>
но я не знаю в анси он или юникоде.
подскажи как мне его попробовать прочитать в анси?
vegarulez (2012-05-11 23:40:00) [16]Я не знаю в каком виде тот сервер выплёвывает данные - это чёрный ящик так сказать... я лиш знаю что это плоский текст в формате xml в кодировке windows-1251
Сергей М. (2012-05-11 23:35:00) [17]
> имеется ввиду сервер из тестового примера
Нам отсюда не видно что там за сервер и из какого тестового примера.
> Как привести ansi к читабельному виду?
Так ты сначала выясни анси там на самом деле или не анси ..
Если анси, то нахрена его принимать в юникодовом виде и потом героически преодолевать проблемы ?
vegarulez (2012-05-11 23:28:00) [18]Сергей М. © (11.05.12 23:19) [39]
ну имеется ввиду сервер из тестового примера.
Да это совсем другой сервер и совсем другая песня. мне нужен был именнованый канал - т.к. по нему идёт обмен данными. Поискал в инете - нашёл стсатью и описание с примерами - вот взял пример и пытаюсь клиента прикруть на другой сервер. Ты абсолютно прав.
vegarulez (2012-05-11 23:25:00) [19]может быть... как тогда мне его привести в требуемый вид???
Вот кусок начинаю чтение
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 к читабельному виду?
Сергей М. (2012-05-11 23:21:00) [20]
> в логах якобы он это в канал плюёт
Так он же вовсе не обязан "плевать" юникодом)
Может он ansi-текст выплевывает)...