Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.19;
Скачать: CL | DM;

Вниз

Выполнение консольного приложения и вывод результатов в МЕМО поле   Найти похожие ветки 

 
Lex_! ©   (2005-12-06 11:02) [0]

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

:)


 
Digitman ©   (2005-12-06 11:15) [1]

см. CreatePipe()


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

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

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;


 
Lex_! ©   (2005-12-06 11:36) [3]

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


 
Digitman ©   (2005-12-06 11:43) [4]


> пробывать


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


 
Lex_! ©   (2005-12-06 12:04) [5]

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

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


 
Digitman ©   (2005-12-06 12:10) [6]


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


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


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


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


 
Lex_! ©   (2005-12-06 12:12) [7]


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

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

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

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


 
Digitman ©   (2005-12-06 12:18) [8]


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


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


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


разумеется !


 
Lex_! ©   (2005-12-06 12:23) [9]

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


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


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


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

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


 
Lex_! ©   (2005-12-06 12:53) [11]

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


> until (Apprunning <> WAIT_TIMEOUT);

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


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


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


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


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


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

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


 
Lex_! ©   (2005-12-06 13:16) [14]


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

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

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


 
Digitman ©   (2005-12-06 13:26) [15]


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


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

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


 
Lex_! ©   (2005-12-06 13:50) [16]

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


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


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


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

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

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


 
Anatoly Podgoretsky ©   (2005-12-06 14:14) [18]

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


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

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);

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



Страницы: 1 вся ветка

Текущий архив: 2006.02.19;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.061 c
1-1137595538
Maverick
2006-01-18 17:45
2006.02.19
MainMenu + Icon + MDI


15-1138315032
Стыдно
2006-01-27 01:37
2006.02.19
г/л в мл/м.куб


1-1137755325
Dec
2006-01-20 14:08
2006.02.19
Печать из Delphi


1-1137509107
_RusLAN
2006-01-17 17:45
2006.02.19
Записать свою информацию на вкладку "Сводка" в свойствах файла


15-1138248576
вурдалак
2006-01-26 07:09
2006.02.19
RAID0+1 дома...