Советы по Delphi


              

Если не принудительно, то можно


Как правильно завершить некое приложение? Nomadic рекомендует следующий код:

Если не принудительно, то можно послать на его Instance сообщение WM_QUIT. Если же необходимо принудительно терминировать приложение, то смотрите ниже - под Windows NT процесс можно терминировать через специально предназначенный для этого хэндл. Иначе гарантии нет. Предположим, что процесс создаем мы, ожидая его завершения в течение maxworktime. Тогда -

    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;
Панферов Андрей делится следующим кодом (рабочий вариант, Delphi 5):

    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;
[001136]


Содержание  Назад  Вперед