Текущий архив: 2008.11.09;
Скачать: CL | DM;
Вниз
Ловим сообщения программы Найти похожие ветки
← →
cruiser © (2008-10-01 14:02) [40]Сергей М., а работает именно ping... или какое-то другое приложение? Я спрашиваю, потому что как раз ping это не показатель. С ping у меня и мой первый код работал.
За "Консольному процессу, очевидно, следует посылать CTRL_C_EVENT
" спасибо, попробую реализовать.
← →
Сергей М. © (2008-10-01 14:05) [41]
> cruiser © (01.10.08 14:02) [40]
> работает именно ping... или какое-то другое приложение?
Именно ping.
А с другим приложением нужно разбираться индивидуально.
← →
cruiser © (2008-10-01 14:17) [42]А вчем тогда может быть разница? Почему перехват сообщений ping.exe нормально происходит и вовремя записывается в memo1, а с тем же кодом , но с другим консольным приложением почему-то коряво отрабатывает код?
← →
Сергей М. © (2008-10-01 14:19) [43]
> cruiser © (01.10.08 14:17) [42]
Приводи конкретный пример - будем посмотреть)
← →
cruiser © (2008-10-01 14:28) [44]Хорошо. Попробую привести конкретный пример, но позже. Кстати, наткнулся тут на один форум и там вот такую фразу прочитал: "....все серьезно обсуждали недостатки метода - когда консольная программа хочет получить от запустившео какие-либо дополнительные данные, то вся система виснет.И никто не обратил внимания, что в CreateProcess в hStdInput и hStdOutput переданы концы hRead и hWrite одного пайпа!"
Не могу понять, может в моем коде это тоже наблюдается?
← →
brother © (2008-10-01 14:30) [45]сделал так:
...
const
ReadBuffer = 240;
...
Apprunning := WaitForSingleObject(ProcessInfo.hProcess, 100);
sleep(50);
if Apprunning <> WAIT_TIMEOUT then Break;
заработал) поигрался даже:
RunDosInMemo("ping 127.0.0.1", Memo1);
и
RunDosInMemo("cmd /?", Memo1);
← →
brother © (2008-10-01 14:31) [46]RunDosInMemo("dir c:\", Memo1);
не отрабатывает(
← →
Leonid Troyanovsky © (2008-10-01 14:33) [47]
> brother © (01.10.08 14:31) [46]
> RunDosInMemo("dir c:\", Memo1);
"cmd /c dir c:\"
--
Regards, LVT.
← →
Сергей М. © (2008-10-01 14:35) [48]
> может в моем коде это тоже наблюдается?
Ну ты же сам вначале сказал, что конс.приложения, с которыми ты намерен работать посредством этого кода, заведомо не будут требовать ввода, так ?
Значит это не твой случай, т.е. тот самый "недостаток" конкретно твоего случая не касается.
← →
cruiser © (2008-10-01 14:36) [49]А кто-нибудь может проверить работу кода с winrar.exe (запуск с параметрами). Будет ли нормально отрабатывать код?
← →
cruiser © (2008-10-01 14:37) [50]
> Ну ты же сам вначале сказал, что конс.приложения, с которыми
> ты намерен работать посредством этого кода, заведомо не
> будут требовать ввода, так ?
Да. Именно так.
← →
Leonid Troyanovsky © (2008-10-01 15:23) [51]
> cruiser © (01.10.08 14:28) [44]
> что в CreateProcess в hStdInput и hStdOutput переданы концы
> hRead и hWrite одного пайпа!"
> Не могу понять, может в моем коде это тоже наблюдается?
Наблюдается. Строку
start.hStdInput := ReadPipe; - убрать
Кроме того, вместо OemToAnsi(Buffer, Buffer) надо
if BytesRead > 0 then
begin
OemToAnsi(Buffer, Buffer);
..
end;
--
Regards, LVT.
← →
cruiser © (2008-10-01 15:37) [52]Спасибо, учту.
← →
cruiser © (2008-10-01 20:31) [53]Проверил всё что мне сказали + совместил всё с кодом от Сергея М. В итоге, получается, что в моём коде строки в memo заполняются быстрее (т.е. не заметна склейка). Это вот что по окночании дочернего процесса в memo:
Îáìåí ïàêåòàìè ñ 127.0.0.1 ïî 32 áàéò:
Îòâåò îò 127.0.0.1: ÷èñëî áàéò=32 âðåìÿ<1ìñ TTL=128
Îòâåò îò 127.0.0.1: ÷èñëî áàéò=32 âðåìÿ<1ìñ TTL=128
Îòâåò îò 127.0.0.1: ÷èñëî áàéò=32 âðåìÿ<1ìñ TTL=128
Îòâåò îò 127.0.0.1:
Не нужно обращать внимание на кракозяблы, это сути не меняет. Во первых при визуальном наблюдении очень заметен процесс склейки Îòâåò îò 127.0.0.1: и ÷èñëî áàéò=32 âðåìÿ<1ìñ TTL=128 частей. В моём (выше [3]) коде склейка визуально незаметна и последняя строка полная.
Где проблема?
← →
Leonid Troyanovsky © (2008-10-02 14:52) [54]
> cruiser © (01.10.08 20:31) [53]
> и последняя строка полная.
> Где проблема?
Сделай цикл таким
repeat
Apprunning := WaitForSingleObject(ProcessInfo.hProcess, 10);
ReadFile(ReadPipe, Buffer[0], ReadBuffer, BytesRead, nil);
if BytesRead = 0 then
Continue;
Buffer[BytesRead] := #0;
OemToAnsi(Buffer, Buffer);
len := AMemo.Perform(WM_GETTEXTLENGTH, 0, 0);
AMemo.Perform(EM_SETSEL, len, len);
AMemo.SelText := Buffer;
AMemo.Perform(EM_SCROLLCARET, 0,0);
Application.ProcessMessages;
until (Apprunning <> WAIT_TIMEOUT) or Application.Terminated;
--
Regards, LVT.
Страницы: 1 2 вся ветка
Текущий архив: 2008.11.09;
Скачать: CL | DM;
Память: 0.57 MB
Время: 0.013 c