Меню сайта
Мини-чат
Чтобы добавить сообщение, необходимо авторизоваться.
Главная » Статьи » Не стандартные примеры на Delphi » API

Как правильно завершить некое приложение?
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
Категория: API | Добавил: DelphiAiX (09.05.2012)
Просмотров: 462 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]