Вопрос № 112528: Я не достаточно умна,пожалуйста,подскажите,как в С++ прописать прогу,чтоб через 2 часа радоты приложения ,она завершала его и на ближайшие пять часов блокировала.Очень нужно..плиз хелп...
Вопрос № 112.528
Я не достаточно умна,пожалуйста,подскажите,как в С++ прописать прогу,чтоб через 2 часа радоты приложения ,она завершала его и на ближайшие пять часов блокировала.Очень нужно..плиз хелп
Отправлен: 05.12.2007, 22:10
Вопрос задала: Танюша (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 4)
Отвечает: Aristos
Здравствуйте, Танюша!
Предлагаемый мною способ основан на методах, называемым внедрением dll. Основан на информации из книги Дж. Рихтера "Создание эффективных WIN32-приложений". По ссылке соответствующая глава в электронном виде.
http://rosigma.com/96.aspx
Кратко о решении.
Решение состоит их 2х частей - программы и библиотеки dll.
Сначало необходимо получить идентификатор интересующего процесса. Его можно посмотреть, например, в Task Manager, попробовать найти процесс по окну и т.д. Программа подобно менеджеру приложений выводит список процессов, и ждет ввода id.
Записываем в реестр (можно было бы, например, в файл записывать) данные для dll - имя процесса и времена ожидания и блокировки.
Затем необходимо выполнить действия от имени интересующего процесса. Для этого было бы хорошо заставить процесс загрузить нашу dll. В windows можно запустить поток в адресном пространстве другого процесса, с помощью функции CreateRemoteThread.
Формат функции потока совпадает с форматом функции LoadLibrary (кроме типа аргемента, но это не важно, посколько используется указатель). Этим мы и воспользуемся.
Кроме того необходимо расположить данные в памяти процесса (у каждого процесса память своя). Это делается с помощью функций VirtualAllocEx и WriteProcessMemory. В выделенную память копируем путь до dll.
Затем запускам в удаленном процессе поток, фактически вызывая от имени процесса LoadLibrary().
Таким способом можно загрузить dll в уже работающий процесс. Загрузить dll в создаваемый процесс (приложение) можно, записав его в реесте по следующему ключу
HKEY_LOCAL_MACHINE SOFTWARE Microsoft Windows NT CurrentVersion Windows AppInit_DLLs
Плохо, что загружаться такая dll будет во все приложения с графическим интерфейсом :) Поэтому необходима поверка что мы было загружено искомое приложение.
Теперь про dll.
При загрузке dll вызывается функция DllMain - аналог main для обычных приложений. Из неё мы проверяем имя процесса и время.
Если мы ожидаем процесс, то запускаем поток, который будет ждать необходимое время, а потом вызовет exit(0) и завершит процесс.
Если время блокировки, то сразу вызываем exit(0).
Метод работает с перезагрузкой приложения (пока ждем завершения, будем ждать в пределах таймаута) и перезагрузкой компьютера.
Приложение:
--------- нет ничего невозможного
Ответ отправил: Aristos (статус: 8-ой класс)
Ответ отправлен: 07.12.2007, 17:37 Оценка за ответ: 5 Комментарий оценки: Спасибо большое
Отправить вопрос экспертам этой рассылки
Приложение (если необходимо):
* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.
Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!
Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.
Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.