Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Выполнение консольного приложения и вывод результатов в МЕМО поле [D7, WinXP]


Lex_! ©   (2005-12-06 11:02:00) 

Где-то видел такую тему но не могу найти, подскажите как сделать запуск программы консольной из своего приложения и вывод результатов работы в Memo поле своего приложения.
Так же как завершить программу запущенную из своего же приложения.

:)


Ботвин Дмитрий   (2005-12-06 14:30:00) [1]

Lex_! ©   (06.12.05 12:53) [11]

Попробуй строку until (Apprunning <> WAIT_TIMEOUT);заменить на

until (Apprunning <> WAIT_TIMEOUT) or (Apprunning <> WAIT_OBJECT_0);

И увеличить таймаут в строке:
Apprunning := WaitForSingleObject(ProcessInfo.hProcess, 300);

Если твои висюки не уйдут, то извиняй, сам дальше разбирайся в своей программе :-)))


Anatoly Podgoretsky   (2005-12-06 14:14:00) [2]

Lex_! ©   (06.12.05 13:16) [14]
ping не досовская программа.


Digitman   (2005-12-06 14:00:00) [3]


> Lex_! ©   (06.12.05 13:50) [16]
> Однако иногда полезно читать что пишут


хм ... действительно полезно) ..

Однако ТОТ ЖЕ самый код (но с "убранной буквой Т") у меня расчудесно работает и ничто при этом не "висит" ..)

а что уж там у тебя"висит" - одному тебе известно)


Lex_!   (2005-12-06 13:50:00) [4]

Однако иногда полезно читать что пишут .. а писал я что этот ключик убрал ...


Digitman   (2005-12-06 13:26:00) [5]


> ping вроде завершается автоматически


с ключем t ? c какого перепугу-то ?)

однако, матчасть нужно знать, , батенька..


Lex_!   (2005-12-06 13:16:00) [6]


> не завершающей свой процесс автоматически

ping вроде завершается автоматически ..
а при создании процесса нигде не указывается автозакрытие приложения? ... что то такое есть в свойствах у досовских программ.. закрывать окно автоматически или нет ...

Ладно спасибо еще раз всем .. :)


Anatoly Podgoretsky   (2005-12-06 13:09:00) [7]

Lex_! ©   (06.12.05 12:53) [11]
Нет разницы, это все равно один и тот же человек.
Наводку дали? Доводи до своих кондинций, а не проси, чтобы было все от слова program до end.


Digitman   (2005-12-06 13:08:00) [8]


> Lex_! ©   (06.12.05 12:53) [11]


> говорил что должен работать пример


он и работает) ... на конкретных дос-задачах ... а то что он у тебя "висит" на какой-то запускаемой тобой задаче, не завершающей свой процесс автоматически, это совершенно иной коленкор)


Lex_!   (2005-12-06 12:53:00) [9]

Я вообще то не говорил что мне КТО-ТО должен ...
я говорил что должен работать пример ...
разницу чувствуете? ...


> until (Apprunning <> WAIT_TIMEOUT);

Я так подозреваю что грабельки тут где то .. только не совсем понимаю, что и как тут ..


Digitman   (2005-12-06 12:30:00) [10]


> Lex_! ©   (06.12.05 12:23) [9]
> Ну примеры должны работать в общем


никто тебе тут ничего не должен)

тебе дали некий фрагмент, реализующий некий алгоритм, твоя задача - по содержимому этого фрагмента сформировать в голове четкое представление целевой логики


Lex_!   (2005-12-06 12:23:00) [11]

Ну примеры должны работать в общем... :)
ладно будем значит разбираться, спасибо :)


Digitman   (2005-12-06 12:18:00) [12]


> Все скопированно отсюда


примеры даются для анализа общей логики алгоритма, а не для слепого передирания)


> саму процедуру исправлять?


разумеется !


Lex_!   (2005-12-06 12:12:00) [13]


> значит исправляй ошибки в своей программе

Все скопированно отсюда, в пустой шаблон, только из команды убрана буква Т ....
сам я вообще ничего не писал своего только проверяю ..

> > 2. Как таким образом запустить две программы
>
>
> точно таким же как и одну программу

Две одновременно ...  тут только по очереди можно ..  саму процедуру исправлять? ...


Digitman   (2005-12-06 12:10:00) [14]


> 1. При запуске какой либо программы, получаем после выполнения
> программы висюк


значит исправляй ошибки в своей программе


> 2. Как таким образом запустить две программы


точно таким же как и одну программу


Lex_!   (2005-12-06 12:04:00) [15]

А если программы должно быть две и одновременно? ....

пара вопросов возникла:
1. При запуске какой либо программы, получаем после выполнения программы висюк (в том же пинге - результат вывелся весь, но программа осталась висеть так же как и при работающем пинге.. ждать можно сколько угодно .. )
2. Как таким образом запустить две программы.


Digitman   (2005-12-06 11:43:00) [16]


> проб ывать


успехов в опроб Овании !


Lex_!   (2005-12-06 11:36:00) [17]

Спасибо, пошел пробывать .. :)


Ботвин Дмитрий   (2005-12-06 11:24:00) [18]

Вывод результата работы консоли в мемо:

procedure RunDosInMemo(CmdLine: string; AMemo: TMemo);
const
 ReadBuffer = 2400;
var
 Security: TSecurityAttributes;
 ReadPipe, WritePipe: THandle;
 start: TStartUpInfo;
 ProcessInfo: TProcessInformation;
 Buffer: Pchar;
 BytesRead: DWord;
 Apprunning: DWord;
begin
 Screen.Cursor := CrHourGlass;
 Form1.Button1.Enabled := False;
 with Security do
 begin
   nlength := SizeOf(TSecurityAttributes);
   binherithandle := true;
   lpsecuritydescriptor := nil;
 end;
 if Createpipe(ReadPipe, WritePipe,
   @Security, 0) then
 begin
   Buffer := AllocMem(ReadBuffer + 1);
   FillChar(Start, Sizeof(Start), #0);
   start.cb := SizeOf(start);
   start.hStdOutput := WritePipe;
   start.hStdInput := ReadPipe;
   start.dwFlags := STARTF_USESTDHANDLES +
     STARTF_USESHOWWINDOW;
   start.wShowWindow := SW_HIDE;

   if CreateProcess(nil,
     PChar(CmdLine),
     @Security,
     @Security,
     true,
     NORMAL_PRIORITY_CLASS,
     nil,
     nil,
     start,
     ProcessInfo) then
   begin
     repeat
       Apprunning := WaitForSingleObject
         (ProcessInfo.hProcess, 100);
       ReadFile(ReadPipe, Buffer[0],
         ReadBuffer, BytesRead, nil);
       Buffer[BytesRead] := #0;
       OemToAnsi(Buffer, Buffer);
       AMemo.Text := AMemo.text + string(Buffer);

       Application.ProcessMessages;
     until (Apprunning <> WAIT_TIMEOUT);
   end;
   FreeMem(Buffer);
   CloseHandle(ProcessInfo.hProcess);
   CloseHandle(ProcessInfo.hThread);
   CloseHandle(ReadPipe);
   CloseHandle(WritePipe);
 end;
 Screen.Cursor := CrDefault;
 Form1.Button1.Enabled := True;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Memo1.Clear;
 RunDosInMemo('ping -t 192.168.222.10', Memo1);
end;


Digitman   (2005-12-06 11:15:00) [19]

см. CreatePipe()


Наверх

Титульная страница Поиск, карта сайта Написать письмо