Как программно запустить Досовское приложение?

Тема в разделе "Delphi - Система", создана пользователем semantics, 16 апр 2008.

Статус темы:
Закрыта.
  1. semantics

    semantics Гость

    Кто ориентируется в программном запуске ехе-шников?
    Есть досовский ехе-файл. Как запустить его программно из другой программы, скомпилированной в среде DELFI?
    Как обнаружить его завершение?
     
  2. ProgeRock

    ProgeRock Гость

    Что касается запуска:
    ShellExecute(HWND_DESKTOP, 'open', 'путь', nil, nil, SW_SHOWNORMAL);
    находится в ShellApi

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

    Wnd:=FindWindow(nil, 'Заголовок');
    if Wnd<>0 then {ехе-файл работает}
    если не имеет идентификатора, то скажите.
     
  3. Yason

    Yason Гость

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

    Я бы для запуска использовал CreateProcess (да, там куча параметров, но большинство можно тупо ставить NULL) - эта функция не только запускает процесс, но и возвращает его идентификатор (через lpProcessInformation.hProcess).
    А потом состояние процесса можно проверять с помощью GetExitCodeProcess: пока процесс живой, будет возвращаться STILL_ACTIVE, в противном случае - код завершения.
     
  4. semantics

    semantics Гость

    Окна у программы нет.
    Есть еще одно уточнение - нужен синхронный запуск, т.е. приостановить выполнение основной программы до завершения подчиненной.
     
  5. zubr

    zubr Гость

    semantics
    Можно используя
    1. ShellExecutEx и WaitForInputIdle или WaitForSingleObject
    2. CreateProcess и WaitForInputIdle или WaitForSingleObject
     
  6. ProgeRock

    ProgeRock Гость

    Код (Text):
    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;
     
  7. zubr

    zubr Гость

    ProgeRock
    GetExitCodeProcess(Hnd, Code); - не самое лучшее решение, тогда надо в цикле вызывать этот код. Лучше сделать:
    WaitForInputIdle(ShellInfo.hProcess, 200); //приложение ждет 200 мс (если надо бесконечно, пока не завершится, то вместо 200, infinite) пока не завершится вызванный процесс
     
  8. semantics

    semantics Гость

    Спасибо, сделал CreateProcess - работает.
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей