| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: WinAPI и системное программирование > Как определить окончание загрузки приложения? |
| Автор: Firster 17.9.2007, 15:54 |
| Уважаемые эксперты! Возник вопрос, связанный с определением окончания(конца) загрузки приложения. Например, как определить сколько секунд грузиться MS Word и т.п. Теоретически все легко. ДЛИТЕЛЬНОСТЬ ЗАГРУЗКИ=ОКОНЧАНИЕ ЗАГРУЗКИ-СТАРТ ЗАГРУЗКИ. А вот как определить ОКОНЧАНИЕ ЗАГРУЗКИ? Заранее спасибо всем откликнувшимся. |
| Автор: MetalFan 17.9.2007, 16:09 |
| WaitForInputIdle Добавлено через 49 секунд правда если приложение не консольное и имеет цикл обработки сообщений |
| Автор: Firster 17.9.2007, 16:54 | ||
Спасибо! Для тех кто столкнулся с такой проблемой даю код как делал я :
|
| Автор: MetalFan 17.9.2007, 18:12 |
эт зачем? |
| Автор: Firster 17.9.2007, 23:05 |
| у меня разница в три часа идет. Поэтому отнимаю 3600 секунд |
| Автор: Firster 18.9.2007, 12:31 |
| Riply Добавлено через 4 минуты и 25 секунд а то как то сложновато.... |
| Автор: Riply 18.9.2007, 14:07 |
| Firster, Выдернуть пример из проекта сложновато: слишком много "внутренних ссылок" :( Если будет время (которого всегда не хватает), то напишу отдельный пример. Это только внешне так кажется. "Не так страшен черт, как его малюют" Читай Help. Споткнулся на каком-то месте - спрашивай. |
| Автор: Firster 20.9.2007, 23:22 |
| Riply хочу спросить по ходу дела. Я так понял ты делала перехват запуска приложения и момент ЗАВЕРШЕНИЯ ЕГО работы. Меня вот что интересует. Делаю инжект ДЛЛ к ВинКомандеру. ДЛЛка успешно перехватывает запуск любого приложения из него (ВинКомандера). При запуске нового приложения из ВинКомандера делаю инжект ДЛЛ к этому процессу. При закрытии процесса должен произойти перехват функции ExitProcess, но его НЕ ПРОИСХОДИТ. Может я не то перехватываю или не в ту степь пошел...? Если есть идеи будк очень благодарен. |
| Автор: Riply 21.9.2007, 03:26 | ||||||
Нет. Не делала. Если ты про мой пост выше, то там ловиться момент завершения инициализации процесса.
Причины могут быть разные: от неправильно сделанного перехвата до "невызова" жертвой целевой функции.
Не понимаю зачем вообще он (перехват ExitProcess) нужен. Можно организовать ожидание завершения процесса, благо его Handle известен. Можно обрабатывать, например, DLL_PROCESS_DETACH - раз уж в него(процесс) залезли. |
| Автор: Firster 22.9.2007, 10:37 | ||||
Точно и как я не дошел до этой мысли!!! Спасибо.
А это какая функция? |
| Автор: Riply 22.9.2007, 16:49 |
Можно попробовать WaitFor(Single)MultipleObject(s), только, наверное не стоит их использовать "внутри" жертвы |
| Автор: Firster 22.9.2007, 21:27 |
WaitForSingleObject подошел. Но возник вопрос с ожиданием ответа функции. Придеться создавать отдельно поток для ожидания ответа о завершении каждого процесса. Буду обрабатывать DLL_PROCESS_DETACH. Но здесь у меня небольшие проблемы... |
| Автор: Riply 23.9.2007, 02:01 | ||||
Если процессов меньше 64, то можно использовать WaitForMultipleObjects - она как раз для этого. Если же их больше, то тоже можно красиво "выкрутиться" - например WaitForMultipleObjectsEx (если правильно помню) или пул потоков.
Что "не так" ? |
| Автор: Firster 23.9.2007, 02:12 |
| Riply а не слишком ли ресурсы это забьет? Я просто еще не знаю как лучше, и нахожусь в так называемом творческом поиске ;) Добавлено через 1 минуту и 43 секунды и спасибо ОГРОМНОЕ, что помогаешь разобраться в этом!!! |
| Автор: Riply 23.9.2007, 02:18 |
Зависит от твоей задачи. Может и стоит пойти на жертвы Почитай Рихтера. Он хорошо и доступно описал способы решения подобных задач, а так же их плюсы и минусы. |
| Автор: Riply 23.9.2007, 02:38 | ||
Смотри не пожалей об этом
Делал ужасно: Где проверка результатов, возвращаемых функциями CreateProcess и WaitForInputIdle ? Почему ты после себя не закрываешь Handle`ы ? Второе, лично я, отношу к разряду грубейших ошибок. Вот тебе для начала (чтобы жизнь медом не казалась). |
| Автор: Firster 24.9.2007, 00:02 | ||
Результат мне нужен только функции WaitForInputIdle грубо говоря, но это сейчас не основное для меня. То был пример ВООБЩЕ! В своей программе я хендлы закрываю. ;) Но за замечания спасибо! |