var dwResult: Longint; // This example was converted from C source. begin // Not tested. Some 'nil' assignments must be applied // as zero assignments in Pascal. Some vars need to // be declared (maxworktime, si, pi). AA. if CreateProcess(nil, CmdStr, nil, nil, FALSE, CREATE_NEW_CONSOLE, nil, nil, si, pi) then begin CloseHandle( pi.hThread ); dwResult := WaitForSingleObject(pi.hProcess, maxworktime*1000*60); CloseHandle( pi.hProcess ); if dwResult <> WAIT_OBJECT_0 then begin pi.hProcess := OpenProcess(PROCESS_TERMINATE, FALSE, pi.dwProcessId); if pi.hProcess <> nil then begin TerminateProcess(pi.hProcess, 0); CloseHandle(pi.hProcess); end; end; end; end; |
var Form1: TForm1; // Глобальные переменные: StartupInfo: TStartupInfo; ProcessInfo: TProcessInformation; StartEn: Boolean = False; implementation {$R *.DFM} // Запуск процесса procedure TForm1.StartButtonClick(Sender: TObject); var CmdStr: PChar; // Командная строка для запуска приложения begin CmdStr := PChar(FilenameEdit1.FileName); // Определение командной строки StartEn := False; // Запущено ли приложение // Без этого приложение не стартует =< FillChar(StartupInfo, Sizeof(StartupInfo), #0); StartupInfo.cb := Sizeof(StartupInfo); StartupInfo.dwFlags := STARTF_USESHOWWINDOW; StartupInfo.wShowWindow := SW_NORMAL; // Состояние окна запущенного приложения // <= Без этого приложение не стартует // Запускаем процесс StartEn := CreateProcess(nil, CmdStr, { указатель командной строки } nil, { указатель на процесс атрибутов безопасности } nil, { указатель на поток атрибутов безопасности } False, { флаг родительского обработчика } CREATE_NEW_CONSOLE or { флаг создания } NORMAL_PRIORITY_CLASS, nil, { указатель на новую среду процесса } nil, { указатель на имя текущей директории } StartupInfo, { указатель на STARTUPINFO } ProcessInfo); { указатель на PROCESS_INF } EndButton.Enabled := StartEn; end; // Терминация процесса procedure TForm1.EndButtonClick(Sender: TObject); begin if StartEn then begin ProcessInfo.hProcess := OpenProcess(PROCESS_TERMINATE, False, ProcessInfo.dwProcessId); if ProcessInfo.hProcess <> Null then begin TerminateProcess(ProcessInfo.hProcess, 0); CloseHandle( ProcessInfo.hThread ); CloseHandle( ProcessInfo.hProcess ); end; end; StartEn := False; EndButton.Enabled := StartEn; end; |