Как можно отследить завершение своего же процессе? Есть ли механизмы в windows для этого? Нужно удалить иконку с трея. Так как в программы может пойти исключение — нужно определить что она завершается и удалить самому.
Здравствуйте, Аноним, Вы писали:
А>Доброе время суток!
А>Как можно отследить завершение своего же процессе? Есть ли механизмы в windows для этого? Нужно удалить иконку с трея. Так как в программы может пойти исключение — нужно определить что она завершается и удалить самому.
А>Заранее спасибо за любую информацию!
Отследить можно. Например, создав второй процесс, который будет следить за состоянием первого.
Или похукать OpenProcess и мониторить все запросы с правами PROCESS_TERMINATE.
Но если стоит задача просто очистить трей от фиктивных иконок, проще найти это окно на десктопе и
заставить его обновиться.
Re[2]: Завершение процесса
От:
Аноним
Дата:
03.02.11 14:12
Оценка:
Здравствуйте, okman, Вы писали:
O>Отследить можно. Например, создав второй процесс, который будет следить за состоянием первого. O>Или похукать OpenProcess и мониторить все запросы с правами PROCESS_TERMINATE. O>Но если стоит задача просто очистить трей от фиктивных иконок, проще найти это окно на десктопе и O>заставить его обновиться.
мне нужно только удалить иконку от своего же приложение, у моего приложение может пойти исключение и тогда закроется не удалив иконку с трея и она там весит, мне нужно как-то удалить ее
Здравствуйте, Аноним, Вы писали:
А>Доброе время суток!
А>Как можно отследить завершение своего же процессе? Есть ли механизмы в windows для этого? Нужно удалить иконку с трея. Так как в программы может пойти исключение — нужно определить что она завершается и удалить самому.
А>Заранее спасибо за любую информацию!
а вообще, лучше отлавливать исключения в самом процессе и там же ручками удалять иконку (+делать другую нужную очистку) перед завершением
Re[2]: Завершение процесса
От:
Аноним
Дата:
03.02.11 14:23
Оценка:
Здравствуйте, urukhai, Вы писали:
U>HANDLE hProcess = OpenProcess() U> + U>WaitForSingleObject( hProcess )
U>а вообще, лучше отлавливать исключения в самом процессе и там же ручками удалять иконку (+делать другую нужную очистку) перед завершением
я отлавливаю их с помощью AddVectoredExceptionHandler, но есть некоторые функции которые используют rpc-сервера и они генерируют исключения внутри и обрабатывают их. То есть вызвал функцию, которая использует rpc-коммуникацию я получу управление в своем обработчике исключений, посчитав что приложение вот-вот вывалится удалю иконку и другую инфу, а не тут то было, функция обработает исключение и программа будет работать. Мне бы это решить и тогда я смогу на обработчик повешать удаление инфы.
Все действия нужно делать в своем же процессе, не подойдет OpenProcess, WaitForSingltObject.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, urukhai, Вы писали:
U>>HANDLE hProcess = OpenProcess() U>> + U>>WaitForSingleObject( hProcess )
U>>а вообще, лучше отлавливать исключения в самом процессе и там же ручками удалять иконку (+делать другую нужную очистку) перед завершением
А>я отлавливаю их с помощью AddVectoredExceptionHandler, но есть некоторые функции которые используют rpc-сервера и они генерируют исключения внутри и обрабатывают их. То есть вызвал функцию, которая использует rpc-коммуникацию я получу управление в своем обработчике исключений, посчитав что приложение вот-вот вывалится удалю иконку и другую инфу, а не тут то было, функция обработает исключение и программа будет работать. Мне бы это решить и тогда я смогу на обработчик повешать удаление инфы.
Тогда почему AddVectoredExceptionHandler с FirstHandler=0 не подходит ?
Re[4]: Завершение процесса
От:
Аноним
Дата:
03.02.11 14:58
Оценка:
Здравствуйте, okman, Вы писали:
O>Тогда почему AddVectoredExceptionHandler с FirstHandler=0 не подходит ?
а разве это не просто последовательность вызовов векторных обработчиков исключений? Сначала идет вызов VEH, а потом SEH и вот в сехе идет обработка исключения. Вроде нету возможности узнать в veh что программа собралась падать или я не прав?
O>>Тогда почему AddVectoredExceptionHandler с FirstHandler=0 не подходит ? А>а разве это не просто последовательность вызовов векторных обработчиков исключений? Сначала идет вызов VEH, а потом SEH и вот в сехе идет обработка исключения. Вроде нету возможности узнать в veh что программа собралась падать или я не прав?
не прав, а кроме того есть еще SetUnhandledExceptionFilter
Как много веселых ребят, и все делают велосипед...
Здравствуйте, Аноним, Вы писали:
А>Как можно отследить завершение своего же процессе? Есть ли механизмы в windows для этого? Нужно удалить иконку с трея. Так как в программы может пойти исключение — нужно определить что она завершается и удалить самому.
Можно вынести этот код в DLL-ку. Их нотифицируют о том, что процесс от них отцепился. Правда, если процесс убъют вызовом TerminateProcess(), то это, к сожалению, не сработает.
Re[6]: Завершение процесса
От:
Аноним
Дата:
03.02.11 16:43
Оценка:
Здравствуйте, ononim, Вы писали:
O>>>Тогда почему AddVectoredExceptionHandler с FirstHandler=0 не подходит ? А>>а разве это не просто последовательность вызовов векторных обработчиков исключений? Сначала идет вызов VEH, а потом SEH и вот в сехе идет обработка исключения. Вроде нету возможности узнать в veh что программа собралась падать или я не прав? O>не прав, а кроме того есть еще SetUnhandledExceptionFilter
то есть, если AddVectoredExceptionHandler, FirstHandler=0 — то я получу управление перед тем, как приложение будет крешиться? а SetUnhandledExceptionFilter он же ставиться на поток, а мне нужно на процесс.
А>то есть, если AddVectoredExceptionHandler, FirstHandler=0 — то я получу управление перед тем, как приложение будет крешиться?
ну мона сказать и так
А>а SetUnhandledExceptionFilter он же ставиться на поток, а мне нужно на процесс.
и опять ты не прав
Как много веселых ребят, и все делают велосипед...
Re[8]: Завершение процесса
От:
Аноним
Дата:
03.02.11 18:28
Оценка:
Здравствуйте, ononim, Вы писали:
А>>то есть, если AddVectoredExceptionHandler, FirstHandler=0 — то я получу управление перед тем, как приложение будет крешиться? O>ну мона сказать и так
сделал как вы написали и получил управление когда оно мне нах не нужно (call stack):