Вопрос № 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 Комментарий оценки: Спасибо большое