Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.5 MB
Время: 0.057 c
6-1131793200
Илья Бобров
2005-11-12 14:00
2006.02.19
Indy FTP


2-1138290229
serko
2006-01-26 18:43
2006.02.19
ListView


2-1138977069
буржуй
2006-02-03 17:31
2006.02.19
Как мне удалить себя внутри себя?


1-1137683565
beglec
2006-01-19 18:12
2006.02.19
Warning Unsafe type pChar


2-1138881209
Kolan
2006-02-02 14:53
2006.02.19
property и Ctrl + Shift + C.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский