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

Вниз

Как запустить из программы другую (консольную) программу?   Найти похожие ветки 

 
Franzy   (2008-05-18 18:27) [0]

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


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


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

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


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

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


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

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


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

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

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


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

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

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


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


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

Врешь.


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

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


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

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


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

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

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


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


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

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


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

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

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


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

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


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

Нет, ни фига не заработало. 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;

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


 
Anatoly Podgoretsky ©   (2008-05-18 20:20) [14]

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


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

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


 
Anatoly Podgoretsky ©   (2008-05-18 20:34) [16]

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

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


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

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

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

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

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


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

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


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

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


 
Leonid Troyanovsky ©   (2008-05-19 18:28) [20]


> Renegat   (18.05.08 19:43) [9]

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

Handle.

--
Regards, LVT.



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

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

Наверх




Память: 0.51 MB
Время: 0.03 c
2-1210777209
Jeqa
2008-05-14 19:00
2008.06.08
автоподстановка (автопоиск)


2-1210816175
kupidon
2008-05-15 05:49
2008.06.08
Dbgid- проблема с шириной столбцов


9-1170325345
antonn
2007-02-01 13:22
2008.06.08
А не устраивать ли нам небольшие конкурсы по кодингу? (ч.22)


2-1211025413
slimer
2008-05-17 15:56
2008.06.08
Отключение ошибок


15-1209283131
Knight
2008-04-27 11:58
2008.06.08
Флешка взбунтовалась&#133