Форум программистов CODEBY.NET Хостинг в Беларуси — Active Technologies

Разработка бизнес сайтов

Нужны клиенты? Тогда сюда быстрее...
X   Сообщение сайта
(Сообщение закроется через 2 секунды)

Здравствуйте, гость ( Вход | Регистрация )




> Как программно запустить Досовское приложение?
semantics
Вставить ник
сообщение 16:04:2008, 12:31
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 3
Регистрация: 16:04:2008
Пользователь №: 16 674
Специализация: экспертные системы



Репутация: - 0 +


Кто ориентируется в программном запуске ехе-шников?
Есть досовский ехе-файл. Как запустить его программно из другой программы, скомпилированной в среде DELFI?
Как обнаружить его завершение?
Подняться вверх 
 
Сообщение #1
 
Новая тема 
Ответов (1 - 7)
ProgeRock
Вставить ник
сообщение 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
Yason
Вставить ник
сообщение 19:04:2008, 18:14
Цитата Ответить 


Продвинутый
**

Группа: Программист
Сообщений: 100
Регистрация: 27:02:2004
Пользователь №: 296



Репутация: - 5 +


Вызывает некоторые сомнения, что дос-приложение будет создавать окошки отличные от "c:\windows\system32\cmd.exe"...

Я бы для запуска использовал CreateProcess (да, там куча параметров, но большинство можно тупо ставить NULL) - эта функция не только запускает процесс, но и возвращает его идентификатор (через lpProcessInformation.hProcess).
А потом состояние процесса можно проверять с помощью GetExitCodeProcess: пока процесс живой, будет возвращаться STILL_ACTIVE, в противном случае - код завершения.
Подняться вверх 
 
Сообщение #3
semantics
Вставить ник
сообщение 21:04:2008, 05:37
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 3
Регистрация: 16:04:2008
Пользователь №: 16 674
Специализация: экспертные системы



Репутация: - 0 +


Цитата(ProgeRock @ 16:04:2008, 17:34 ) *
Что касается запуска:
ShellExecute(HWND_DESKTOP, 'open', 'путь', nil, nil, SW_SHOWNORMAL);
находится в ShellApi

А вот чтоб обнаружить завершение: если приложение имеет идентификатор окна, то пойдет
Код
Wnd: HWd;

Wnd:=FindWindow(nil, 'Заголовок');
if Wnd<>0 then {ехе-файл работает}


если не имеет идентификатора, то скажите.


Окна у программы нет.
Есть еще одно уточнение - нужен синхронный запуск, т.е. приостановить выполнение основной программы до завершения подчиненной.
Подняться вверх 
 
Сообщение #4
zubr
Вставить ник
сообщение 21:04:2008, 06:29
Цитата Ответить 


Божественный
*****

Группа: Модеры
Сообщений: 899
Регистрация: 19:11:2003
Пользователь №: 133



Репутация: - 11 +


semantics
Можно используя
1. ShellExecutEx и WaitForInputIdle или WaitForSingleObject
2. CreateProcess и WaitForInputIdle или WaitForSingleObject
Подняться вверх 
 
Сообщение #5
ProgeRock
Вставить ник
сообщение 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
zubr
Вставить ник
сообщение 22:04:2008, 03:44
Цитата Ответить 


Божественный
*****

Группа: Модеры
Сообщений: 899
Регистрация: 19:11:2003
Пользователь №: 133



Репутация: - 11 +


ProgeRock
GetExitCodeProcess(Hnd, Code); - не самое лучшее решение, тогда надо в цикле вызывать этот код. Лучше сделать:
WaitForInputIdle(ShellInfo.hProcess, 200); //приложение ждет 200 мс (если надо бесконечно, пока не завершится, то вместо 200, infinite) пока не завершится вызванный процесс
Подняться вверх 
 
Сообщение #7
semantics
Вставить ник
сообщение 22:04:2008, 07:15
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 3
Регистрация: 16:04:2008
Пользователь №: 16 674
Специализация: экспертные системы



Репутация: - 0 +


Спасибо, сделал CreateProcess - работает.
Подняться вверх 
 
Сообщение #8


Быстрый ответ  Ответить  Новая тема 

> Быстрый ответ
Полужирный
Курсив
Подчеркнутый
Вставить изображение
Смайлики
Цитата
Код
 
 Отправлять уведомления об ответах на e-mail |  Включить смайлики |  Добавить подпись
   

 

RSS Текстовая версия Сейчас: 17:05:2008 - 08:35
с нами можно связаться по:
телефону: +375-(29)-632-60-67
e-mail:info@codeby.net