Помощник
Здравствуйте, гость ( Вход | Регистрация )
|
|
16:04:2008, 12:31
|
|
Новенький ![]() Группа: Программист Сообщений: 3 Регистрация: 16:04:2008 Пользователь №: 16 674 Специализация: экспертные системы Репутация: 0
|
Кто ориентируется в программном запуске ехе-шников?
Есть досовский ехе-файл. Как запустить его программно из другой программы, скомпилированной в среде DELFI? Как обнаружить его завершение? |
|
Сообщение
#1
|
|
![]() |
|
|
16:04:2008, 17:34
|
|
Новенький ![]() Группа: Программист Сообщений: 44 Регистрация: 12:03:2008 Пользователь №: 15 803 Репутация: 0
|
Что касается запуска:
ShellExecute(HWND_DESKTOP, 'open', 'путь', nil, nil, SW_SHOWNORMAL); находится в ShellApi А вот чтоб обнаружить завершение: если приложение имеет идентификатор окна, то пойдет Код Wnd: HWd; Wnd:=FindWindow(nil, 'Заголовок'); if Wnd<>0 then {ехе-файл работает} если не имеет идентификатора, то скажите. |
|
Сообщение
#2
|
|
|
|
19:04:2008, 18:14
|
|
Продвинутый ![]() ![]() Группа: Программист Сообщений: 100 Регистрация: 27:02:2004 Пользователь №: 296 Репутация: 5
|
Вызывает некоторые сомнения, что дос-приложение будет создавать окошки отличные от "c:\windows\system32\cmd.exe"...
Я бы для запуска использовал CreateProcess (да, там куча параметров, но большинство можно тупо ставить NULL) - эта функция не только запускает процесс, но и возвращает его идентификатор (через lpProcessInformation.hProcess). А потом состояние процесса можно проверять с помощью GetExitCodeProcess: пока процесс живой, будет возвращаться STILL_ACTIVE, в противном случае - код завершения. |
|
Сообщение
#3
|
|
|
|
21:04:2008, 05:37
|
|
Новенький ![]() Группа: Программист Сообщений: 3 Регистрация: 16:04:2008 Пользователь №: 16 674 Специализация: экспертные системы Репутация: 0
|
Что касается запуска: ShellExecute(HWND_DESKTOP, 'open', 'путь', nil, nil, SW_SHOWNORMAL); находится в ShellApi А вот чтоб обнаружить завершение: если приложение имеет идентификатор окна, то пойдет Код Wnd: HWd; Wnd:=FindWindow(nil, 'Заголовок'); if Wnd<>0 then {ехе-файл работает} если не имеет идентификатора, то скажите. Окна у программы нет. Есть еще одно уточнение - нужен синхронный запуск, т.е. приостановить выполнение основной программы до завершения подчиненной. |
|
Сообщение
#4
|
|
|
|
21:04:2008, 06:29
|
|
Божественный ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 899 Регистрация: 19:11:2003 Пользователь №: 133 Репутация: 11
|
semantics
Можно используя 1. ShellExecutEx и WaitForInputIdle или WaitForSingleObject 2. CreateProcess и WaitForInputIdle или WaitForSingleObject |
|
Сообщение
#5
|
|
|
|
21:04:2008, 23:35
|
|
Новенький ![]() Группа: Программист Сообщений: 44 Регистрация: 12:03:2008 Пользователь №: 15 803 Репутация: 0
|
Код procedure TForm1.Button1Click(Sender: TObject);
var ShellInfo: TShellExecuteInfo; Code: DWord; Hnd: THandle; begin FillChar(ShellInfo, SizeOf(TShellExecuteInfo), 0); ShellInfo.cbSize:=SizeOf(TShellExecuteInfo); ShellInfo.fMask:=SEE_MASK_NOCLOSEPROCESS; ShellInfo.Wnd:=HWND_DESKTOP; ShellInfo.lpFile:='путь к файлу'; ShellInfo.lpParameters:=nil; ShellInfo.lpDirectory:=nil; ShellInfo.nShow:=SW_SHOWNORMAL; ShellExecuteEx(@ShellInfo); //Можно использовать вместо ShellExecute Hnd:=ShellInfo.hProcess ; GetExitCodeProcess(Hnd, Code); if Code=Still_Active then {приложение работает}; end; |
|
Сообщение
#6
|
|
|
|
22:04:2008, 03:44
|
|
Божественный ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 899 Регистрация: 19:11:2003 Пользователь №: 133 Репутация: 11
|
ProgeRock
GetExitCodeProcess(Hnd, Code); - не самое лучшее решение, тогда надо в цикле вызывать этот код. Лучше сделать: WaitForInputIdle(ShellInfo.hProcess, 200); //приложение ждет 200 мс (если надо бесконечно, пока не завершится, то вместо 200, infinite) пока не завершится вызванный процесс |
|
Сообщение
#7
|
|
|
|
22:04:2008, 07:15
|
|
Новенький ![]() Группа: Программист Сообщений: 3 Регистрация: 16:04:2008 Пользователь №: 16 674 Специализация: экспертные системы Репутация: 0
|
Спасибо, сделал CreateProcess - работает.
|
|
Сообщение
#8
|
|
![]() |
|
Текстовая версия | Сейчас: 17:05:2008 - 08:35 |