Форум: "WinAPI";
Текущий архив: 2006.02.19;
Скачать: [xml.tar.bz2];
ВнизВыполнение консольного приложения и вывод результатов в МЕМО поле Найти похожие ветки
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2006.02.19;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.037 c