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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.03.2013, 07:00   #1
Anton911
Форумчанин
 
Аватар для Anton911
 
Регистрация: 23.08.2011
Сообщений: 171
По умолчанию Закрыть чужую программу при завершении своей.

Всем привет. В общем такая проблемка нужно завершить чужую программу в тот момент, когда моя программа была завершена. С случаем обычного выхода из программы всё понятно. В событие формы OnClose пишем код закрытия программы. И это работает. Но если я открываю диспетчер задач и жму завершить процесс (моей программы), то до OnClose дело не доходит. Я уже пробовал писать dll'ку и загружать ее программой (LoadLibrary), а в ней по таймеру (Всмысле поток+while) проверять запущена ли моя программа, таймер то такой работает. Короче не помогает! Как же это сделать правильно? Или шамански.

Попробую покачто сделать две программы, одна запускает другую, и одна завершается если вторая убилась. А заодно они будут и чужую програмку килить. Щас поизвращаюсь.
Каждый день узнаю новое...

Последний раз редактировалось Anton911; 08.03.2013 в 07:14.
Anton911 вне форума Ответить с цитированием
Старый 08.03.2013, 17:25   #2
Anton911
Форумчанин
 
Аватар для Anton911
 
Регистрация: 23.08.2011
Сообщений: 171
По умолчанию

Сделал две програмки, одну закинул в ресурсы к другой. При запуске второй она распаковывает первую и запускает. Далее они контролируют друг друга. В общем всё работает. Но неужели нельзя сделать по другому? Без двух программ.
Каждый день узнаю новое...
Anton911 вне форума Ответить с цитированием
Старый 08.03.2013, 17:37   #3
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
если я открываю диспетчер задач и жму завершить процесс
мало кто из рядовых пользователей так закрывает программы, разве что зависшие. Чем вызвана такая необходимость?
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 09.03.2013, 06:23   #4
Anton911
Форумчанин
 
Аватар для Anton911
 
Регистрация: 23.08.2011
Сообщений: 171
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
мало кто из рядовых пользователей так закрывает программы, разве что зависшие. Чем вызвана такая необходимость?
Делаю античитерский лаунчер для игры. Если пользователь каким-либо образом закроет этот лаунчер запущеная игра также должна быть завершена.
Каждый день узнаю новое...
Anton911 вне форума Ответить с цитированием
Старый 09.03.2013, 11:26   #5
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...а что мешает запустить игру без вашего лаунчера?
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 09.03.2013, 14:33   #6
develsnik
Форумчанин
 
Регистрация: 21.02.2013
Сообщений: 105
По умолчанию

вот пример.
Надо немного переделать
http://www.delphisources.ru/pages/so...closeprog.html
develsnik вне форума Ответить с цитированием
Старый 09.03.2013, 20:38   #7
Kix.IV
Участник клуба
 
Регистрация: 11.08.2012
Сообщений: 1,226
По умолчанию

А реализовать это в игре не можешь?
Kix.IV вне форума Ответить с цитированием
Старый 11.03.2013, 04:08   #8
Anton911
Форумчанин
 
Аватар для Anton911
 
Регистрация: 23.08.2011
Сообщений: 171
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
...а что мешает запустить игру без вашего лаунчера?
На игровом сервере стоит пароль. Пользователь незнает пароль. Лаунчер знает. Поэтому без лаунчера никак не соединишся. Если соединишся и ЗакроешьЛаунчер\Читеришь, тогда TerminateProcess.

Цитата:
Сообщение от develsnik Посмотреть сообщение
вот пример.
Надо немного переделать
http://www.delphisources.ru/pages/so...closeprog.html
Немного не то. Получается как убить процесс я знаю. Но проблемка была, если через диспетчер задач убить лаунчер, то лаунчер не успивал убить игру. Покачто решил эту проблему используя две программы. Одна лежить в ресурсах у другой. Та что в ресурсах распаковывается при запуске первой и запускается. Далее они проверяют друг друга. Если одна из них не запущена, то убивают игру и друг друга.

Цитата:
Сообщение от Kix.IV Посмотреть сообщение
А реализовать это в игре не можешь?
Игра не моя)
Каждый день узнаю новое...

Последний раз редактировалось Anton911; 11.03.2013 в 04:13.
Anton911 вне форума Ответить с цитированием
Старый 11.03.2013, 06:00   #9
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

могу ошибаться не помню точно
если приложение запускает Job и в jobе другое приложение то при кончине первого закроется job со всем содержимым внутри
CreateJobObject
AssignProcessToJobObject
+JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE

http://yandex.ru/yandsearch?text=JOB...L_ON_JOB_CLOSE

тут через дебаг
http://forum.vingrad.ru/topic-188313.html
Не стесняемся, плюсуем!

Последний раз редактировалось Slym; 11.03.2013 в 06:30.
Slym вне форума Ответить с цитированием
Старый 11.03.2013, 18:22   #10
Anton911
Форумчанин
 
Аватар для Anton911
 
Регистрация: 23.08.2011
Сообщений: 171
По умолчанию

Позновательно. Попробовал сделать через дебаг. Игра запускается. Попробовал запустить с несколькими параметрами. Запустилось. Но когда дописал параметры "-connect=ip -port=2302". По идее должна соединяться напрямую с сервером, а получил неожиданную бесконечную загрузку.

Код:
procedure TExecDebug.Execute;
var
  si: STARTUPINFO;
  pi: PROCESS_INFORMATION;
  ed: DEBUG_EVENT;
begin
  FreeOnTerminate := true;
  FillChar(si, sizeof(si), 0);
  si.cb := sizeof(si);
  if CreateProcess(nil, PWideChar(FArg),
                   nil, nil, FALSE, DEBUG_ONLY_THIS_PROCESS,
                   nil, nil, si, pi) then begin
    while not Terminated do begin
      if not WaitForDebugEvent(ed, 0) then
      application.ProcessMessages;

      case ed.dwDebugEventCode of
        EXIT_PROCESS_DEBUG_EVENT: ContinueDebugEvent(ed.dwProcessId, ed.dwThreadId, DBG_CONTINUE);
        CREATE_THREAD_DEBUG_EVENT:ContinueDebugEvent(ed.dwProcessId, ed.dwThreadId, DBG_CONTINUE);
        EXIT_THREAD_DEBUG_EVENT:ContinueDebugEvent(ed.dwProcessId, ed.dwThreadId, DBG_CONTINUE);
        LOAD_DLL_DEBUG_EVENT:ContinueDebugEvent(ed.dwProcessId, ed.dwThreadId, DBG_CONTINUE);
        UNLOAD_DLL_DEBUG_EVENT:ContinueDebugEvent(ed.dwProcessId, ed.dwThreadId, DBG_CONTINUE);
        OUTPUT_DEBUG_STRING_EVENT:ContinueDebugEvent(ed.dwProcessId, ed.dwThreadId, DBG_CONTINUE);
     else
      ContinueDebugEvent(ed.dwProcessId, ed.dwThreadId, DBG_CONTINUE);
      end;
    end;
    CloseHandle( pi.hThread );
    CloseHandle( pi.hProcess );
  end;
end;
P.S. ошибки в параметрых исключены. Через батник всё отлично запускается. Через ShellExecute тоже. И через OpenProcess если ставить не дебаг а нормал приорити.
Каждый день узнаю новое...

Последний раз редактировалось Anton911; 11.03.2013 в 18:26.
Anton911 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Закрыть чужую программу kholoshchak Общие вопросы Delphi 1 27.04.2011 15:06
Server2008(x64) не может закрыть моё приложение при завершении работы системы, но убивается через ДЗ Человек_Борща Общие вопросы Delphi 6 02.03.2011 17:20
Запустить чужую программу со своей dll библиотекой или внедрить в уже существующий процесс Человек_Борща Общие вопросы Delphi 5 23.01.2011 21:20
Закрыть программу, при ошибке Dr.Badnezz Общие вопросы Delphi 7 16.01.2009 00:32
Как со своей проги запустить чужую SeRhy Помощь студентам 5 04.11.2007 11:18