Форум программистов CodeGuru
20 Октябрь 2018, 07:56:44 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Управление одной программой из другой  (Прочитано 16119 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Питон
Новичок
*
Офлайн Офлайн

Сообщений: 4


Просмотр профиля
« : 13 Апрель 2007, 01:23:41 »

Подскажите, пожалуйста, как завершить работающий exe-шник программно (С++).
Запуск процесса был осуществлён:

CreateProcess(
   "SoundFormationPrj.exe",
   NULL,
   NULL,
   NULL,
   FALSE,
   0,
   NULL,
   NULL,
   &si,
   &pi)

(фактичесски - запущен Delphi exe из плюсов).

Буду очень благодарен, если выложите все процедуры работы с такого рода процессами.

Спасибо.
Записан
3V
Администратор
Ветеран
*****
Офлайн Офлайн

Сообщений: 1347



Просмотр профиля WWW
« Ответ #1 : 13 Апрель 2007, 23:41:26 »

Есть функция TerminateProcess
Код:
BOOL TerminateProcess(
 HANDLE hProcess,
 UINT uExitCode
);

Это не управление получается.
Это получается - просто прибить процесс.
Все данные процесса будут потеряны. Весь вывод, который производился - будет не завершен.
TerminateProcess в win95/98 могла иногда валить систему. в 2k и выше - такого не случится.

Вообще, если надо именно завершить процесс корректно, то процесс должен иметь какой то интерфейс, при помощи которого его можно завершить. Например, приложения с GUI обычно обрабатывают сообщение WM_QUIT. Его можно заслать в главный поток процесса. Можно послать окну верхнего уровня главного потока сообщение WM_CLOSE, и.т.д.

В MSDN, вроде была статья. Что то типа "Terminating process cleanly" или что то типа этого. Там как раз предлагалось (на сколько я помню) слать окну WM_CLOSE, потом (вроде WM_QUIT), потом уже пришибать. При совершении действий - ждать завершения при помощи WaitForSingleObject с таймаутом. WaitForSingleObject отдается дескриптор процесса, полученный при его запуске из структуры PROCESS_INFORMATION, указатель на которую передается в CreateProcess, или можно еще получить при помощи OpenProcess.

Так что если требуется, чтобы одно приложение выполняло команды другого (в том числе и для выхода), надо в этом втором приложении реализовать некий интерфейс управления (все равно как - через сообщения, COM, объекты синхронизации, сокеты, DDE, пайпы, или еще что то), через который и подавать сигнал, который говорит приложению завершиться.
Записан

Питон
Новичок
*
Офлайн Офлайн

Сообщений: 4


Просмотр профиля
« Ответ #2 : 14 Апрель 2007, 01:01:22 »

Большое спасибо.Улыбка
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2015, Simple Machines Valid XHTML 1.0! Valid CSS!