![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как запустить из программы другую (консольную) программу? [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]
> Заодно уточнить хочу, вернется ли управление оболочке сразу
> или только по окончании работы запущенной проги.
Это зависит от твоего желания.