Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.07.2012, 13:03   #1
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,893
Вопрос Ожидание выполнения TerminateProcess

Код:
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
Можно ли с (дождаться завершения процесса)
Код:
begin
  TerminateProcess(ProcessInfo.hProcess, 0);
  CloseHandle(ProcessInfo.hProcess);
  CloseHandle(ProcessInfo.hThread);
end;
проделать тоже самое, что и с
Код:
begin
  FillChar(StartupInfo, SizeOf(StartupInfo), 0);
  StartupInfo.cb := SizeOf(StartupInfo);
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
  StartupInfo.wShowWindow := SW_SHOWNORMAL;

  FillChar(ProcessInfo, SizeOf(ProcessInfo), 0);

  if CreateProcess(nil,
                   PChar(ExtractFilePath(Application.ExeName) + 'Project5.exe'),
                   nil,
                   nil,
                   False,
                   CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,
                   nil,
                   nil,
                   StartupInfo,
                   ProcessInfo) then
  begin
    WaitforSingleObject(ProcessInfo.hProcess, INFINITE); // Ждём до завершения процесса
  end;
end;
И не является ли TerminateProcess(ProcessInfo.hProce ss, 0); жестоким способом завершения процесса?
Shouldercannon вне форума Ответить с цитированием
Старый 12.07.2012, 13:32   #2
volvo877
Форумчанин
 
Аватар для volvo877
 
Регистрация: 01.06.2009
Сообщений: 108
По умолчанию

Цитата:
Можно ли с (дождаться завершения процесса)
Можно.

TerminateProcess function:
Цитата:
TerminateProcess is asynchronous; it initiates termination and returns immediately. If you need to be sure the process has terminated, call the WaitForSingleObject function with a handle to the process.
Цитата:
И не является ли TerminateProcess(ProcessInfo.hProce ss, 0); жестоким способом завершения процесса?
Является. Процесс не может противостоять этому приказу.
volvo877 вне форума Ответить с цитированием
Старый 12.07.2012, 14:06   #3
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,893
По умолчанию

Помягче способа завершения процесса созданного через CreateProcess нет?
Shouldercannon вне форума Ответить с цитированием
Старый 12.07.2012, 14:58   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Windows не умеет нормально завершать процессы, особенно оконные. Да и многое от программистов зависит очень многое. Даже Microsoft Document Explorer не умеет закрываться при завершении виндовс(WM_ENDSESSION, WM_QUERTYENDSESSION) а также UpdateCheck от Embracodero, и по этому мне пришлось написать программу которая ищет их и убивает на месте, ибо не выключается система из-за ошибки ололо кодеров.

Получайте окна приложения(EnumWindows по hProcess(не PID)) и посылайте туда WM_EXIT, WM_ENDSESSION, WM_QUERTYENDSESSION,WM_CLOSE(что-то одно, ну или "Пока окно существует(ололо) делем ...") через SendMessageAndWait(см. MSDN), так найболее мягко можно прикрыть не консольное приложение.

Ну а консольным светит расстрел, если у них нет child-процесов, а если есть.. то будет кучка не корректных заверешений критических процессов.

Я даю юзеру определиться, как он хочет завершить тот или иной процесс, например можно просто прибить его и все порожденные, связаннве с ним или послать туда команду(последовательность), или оконное сообщение(если процесс GUI).

GUI или не GUI определяйте чтением PE заголовка, так проще, тем более что там есть флаг отв. за тип бинарника.

Последний раз редактировалось Человек_Борща; 12.07.2012 в 15:06.
Человек_Борща вне форума Ответить с цитированием
Старый 12.07.2012, 15:03   #5
volvo877
Форумчанин
 
Аватар для volvo877
 
Регистрация: 01.06.2009
Сообщений: 108
По умолчанию

Можно попробовать PostThreadMessage + WM_QUIT, но не факт что всегда сработает.

Сами Microsoft-овцы рекомендуют делать это вот так: How To Terminate an Application "Cleanly" in Win32
volvo877 вне форума Ответить с цитированием
Старый 12.07.2012, 15:15   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Можно попробовать PostThreadMessage + WM_QUIT, но не факт что всегда сработает.
не, не стоит так делать.
окна не будут корректно уничтожены, а ведь может быть с ними связано многое.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.07.2012, 15:24   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Пепел Феникса, согласен Проходили уже это.
Цитата:
Можно попробовать PostThreadMessage + WM_QUIT, но не факт что всегда сработает.
Вы уверены, что хотите выйти из приложения? Закрыть текущий проект? Сохранить текущий проект? Вы точно уверены в том, что хотите выйти? & etc... Ожидает вас =)

Обычно дураков нет и кооректно отрабатывает WM_ENDSESSION, WM_QUERTYENDSESSION.

Последний раз редактировалось Человек_Борща; 12.07.2012 в 15:27.
Человек_Борща вне форума Ответить с цитированием
Старый 13.07.2012, 17:37   #8
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,893
По умолчанию

С EnumWindows не смог сделать, получилось с FindWindow
Код:
  Wind := FindWindow(nil, PChar(s));
  if (Wind <> 0) then  PostMessage(FindWindow(nil, PChar(s)), WM_CLOSE, 0, 0);
Теперь процесс завершается гуманно.
Shouldercannon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
мультипоточное ожидание Fun_tick C# (си шарп) 5 05.03.2012 15:00
TerminateProcess и windows Server 2008 . Неработает. Человек_Борща Общие вопросы Delphi 7 16.02.2011 13:49
Ожидание выполнения файла .cmd Droid Общие вопросы Delphi 14 01.08.2010 17:05
Ожидание нажатия клавиши shurik_7866 Общие вопросы Delphi 2 25.04.2010 19:53
ожидание внутри процедуры Juffin Общие вопросы Delphi 5 01.06.2009 13:52