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

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

Как запустить из программы другую (консольную) программу? [D7]


Franzy ©   (2008-05-18 18:27:00) 

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


Leonid Troyanovsky   (2008-05-19 18:28:00) [1]


> Renegat   (18.05.08 19:43) [9]

> - PID процесса, то она ждёт пока он не завершит работу.

Handle.

--
Regards, LVT.


Franzy   (2008-05-18 21:42:00) [2]

БОЛЬШОЕ СПАСИБО!


Германн   (2008-05-18 21:40:00) [3]

http://delphimaster.ru/cgi-bin/faq.pl?look=1&id=988621841&n=15


Franzy   (2008-05-18 20:40:00) [4]

Ага, WinExec оказывается вовсе не хэндл возвращает, а номер ошибки...

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

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

Запускаемая прога лежит в той же папке, что и прога-оболочка.


Anatoly Podgoretsky   (2008-05-18 20:34:00) [5]

> Franzy  (18.05.2008 20:24:15)  [15]

Неправильно думал, до 200х это была отдельная справка.
Ну и теперь когда ты добрался до справки, то надеюсь, что ты прочитал - что WinExec это для совместимости с Win 3.0


Franzy   (2008-05-18 20:24:00) [6]

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


Anatoly Podgoretsky   (2008-05-18 20:20:00) [7]

Научись пользоваться справкой, в Дельфи даже отдельный пункт в меню есть по SDK


Franzy   (2008-05-18 20:19:00) [8]

Нет, ни фига не заработало. WaitForSingleObject не ждет конца работы программы!!!!

Вот мой код:
procedure TForm1.Button6Click(Sender: TObject);
var   h:THandle;
begin
 SaveProject(curproject);
 h:=WinExec(PAnsiChar('gridder2D.exe '+curproject),SW_SHOWNORMAL);
 WaitForSingleObject(h,INFINITE);
 ShowMessage('OK');
end;

Мессадж выскакивает задолго до того (хоть и не сразу), как закончит работать консольная прога (ее окно же видно).


Franzy   (2008-05-18 20:07:00) [9]

Все отлично заработало, спасибо, Renegat!


Franzy   (2008-05-18 20:04:00) [10]

Есть, объем чуть меньше 42 Мб...

Та-а-ак... WinExec требует ей передавать в качестве аргумента имя проги в формате PAnsiChar, который несовместим со string и даже TFileName. Тупо заюзал тайпкастинг, вроде заработало.


Германн   (2008-05-18 19:50:00) [11]


> Franzy   (18.05.08 19:37) [8]
>
> 2 Германн
> Не знаю, может в моих дельфях справка обрезанная. Ни функции
> WinExec, ни функции WaitForSingleObject она не знает.
>

Program Files\Common Files\Borland Shared\MSHelp\
Такой каталог на диске есть?


Renegat   (2008-05-18 19:43:00) [12]

> Можно поподробнее про функцию WaitForSingleObject?
> что она делает?

Она приостанавливает вызвавший её поток на заданное кол-во миллисекунд, или до наступления определённого события. Чтобы она могла ждать бесконечно долго, ставь вторым парамом константу INFINITE. В данном случае, если переданный параметр - PID процесса, то она ждёт пока он не завершит работу.


Franzy   (2008-05-18 19:37:00) [13]

2 Германн
Не знаю, может в моих дельфях справка обрезанная. Ни функции WinExec, ни функции WaitForSingleObject она не знает.


Franzy   (2008-05-18 19:36:00) [14]

Можно поподробнее про функцию WaitForSingleObject? Для нее справки нет. Первый параметр у нее - это хэндл. Второй - время в миллисекундах. (Судя по названиям). Но что она делает? Или хотя бы пример.


Германн   (2008-05-18 19:32:00) [15]


> Franzy   (18.05.08 19:17) [4]
>
> 1. По winexec справки нет.

Врешь.


Renegat   (2008-05-18 19:28:00) [16]

> uCmdShow:cardinal
Флаг, определяющий, будет ли показываться окно программы. В данном случае, окно виртуальной машины. Ставь SW_SHOWNORMAL и всё будет =)

> Как сделать так, чтобы управление вернулось только по окончании работы консольной проги?
По хендлу, который тебе возвернула первая или вторая функция, запустить WaitForSingleObject.


Franzy   (2008-05-18 19:17:00) [17]

1. По winexec справки нет. Что у нее за второй параметр? Первый, понятно, командная строка, а второй, который uCmdShow:cardinal?

2. Как сделать так, чтобы управление вернулось только по окончании работы консольной проги? Или хотя бы как определить, что она закончила работу?


Renegat   (2008-05-18 19:06:00) [18]

Кури хелп по WinExec или CreateProcess.
ЗЫ А управление вернётся сразу после старта "дочерней" проги


Franzy   (2008-05-18 19:04:00) [19]

Так как запустить-то?


Германн   (2008-05-18 18:39:00) [20]


> Заодно уточнить хочу, вернется ли управление оболочке сразу
> или только по окончании работы запущенной проги.

Это зависит от твоего желания.


Наверх

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