Завершение процесса
От: Аноним  
Дата: 03.02.11 13:44
Оценка:
Доброе время суток!

Как можно отследить завершение своего же процессе? Есть ли механизмы в windows для этого? Нужно удалить иконку с трея. Так как в программы может пойти исключение — нужно определить что она завершается и удалить самому.

Заранее спасибо за любую информацию!
Re: Завершение процесса
От: okman Беларусь https://searchinform.ru/
Дата: 03.02.11 14:08
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Доброе время суток!


А>Как можно отследить завершение своего же процессе? Есть ли механизмы в windows для этого? Нужно удалить иконку с трея. Так как в программы может пойти исключение — нужно определить что она завершается и удалить самому.


А>Заранее спасибо за любую информацию!


Отследить можно. Например, создав второй процесс, который будет следить за состоянием первого.
Или похукать OpenProcess и мониторить все запросы с правами PROCESS_TERMINATE.
Но если стоит задача просто очистить трей от фиктивных иконок, проще найти это окно на десктопе и
заставить его обновиться.
Re[2]: Завершение процесса
От: Аноним  
Дата: 03.02.11 14:12
Оценка:
Здравствуйте, okman, Вы писали:

O>Отследить можно. Например, создав второй процесс, который будет следить за состоянием первого.

O>Или похукать OpenProcess и мониторить все запросы с правами PROCESS_TERMINATE.
O>Но если стоит задача просто очистить трей от фиктивных иконок, проще найти это окно на десктопе и
O>заставить его обновиться.

мне нужно только удалить иконку от своего же приложение, у моего приложение может пойти исключение и тогда закроется не удалив иконку с трея и она там весит, мне нужно как-то удалить ее
Re: Завершение процесса
От: urukhai Украина  
Дата: 03.02.11 14:14
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Доброе время суток!


А>Как можно отследить завершение своего же процессе? Есть ли механизмы в windows для этого? Нужно удалить иконку с трея. Так как в программы может пойти исключение — нужно определить что она завершается и удалить самому.


А>Заранее спасибо за любую информацию!


HANDLE hProcess = OpenProcess()
+
WaitForSingleObject( hProcess )

а вообще, лучше отлавливать исключения в самом процессе и там же ручками удалять иконку (+делать другую нужную очистку) перед завершением
Re[2]: Завершение процесса
От: Аноним  
Дата: 03.02.11 14:23
Оценка:
Здравствуйте, urukhai, Вы писали:

U>HANDLE hProcess = OpenProcess()

U> +
U>WaitForSingleObject( hProcess )

U>а вообще, лучше отлавливать исключения в самом процессе и там же ручками удалять иконку (+делать другую нужную очистку) перед завершением


я отлавливаю их с помощью AddVectoredExceptionHandler, но есть некоторые функции которые используют rpc-сервера и они генерируют исключения внутри и обрабатывают их. То есть вызвал функцию, которая использует rpc-коммуникацию я получу управление в своем обработчике исключений, посчитав что приложение вот-вот вывалится удалю иконку и другую инфу, а не тут то было, функция обработает исключение и программа будет работать. Мне бы это решить и тогда я смогу на обработчик повешать удаление инфы.

Все действия нужно делать в своем же процессе, не подойдет OpenProcess, WaitForSingltObject.
Re[3]: Завершение процесса
От: okman Беларусь https://searchinform.ru/
Дата: 03.02.11 14:35
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, 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 что программа собралась падать или я не прав?
Re[5]: Завершение процесса
От: ononim  
Дата: 03.02.11 16:30
Оценка:
O>>Тогда почему AddVectoredExceptionHandler с FirstHandler=0 не подходит ?
А>а разве это не просто последовательность вызовов векторных обработчиков исключений? Сначала идет вызов VEH, а потом SEH и вот в сехе идет обработка исключения. Вроде нету возможности узнать в veh что программа собралась падать или я не прав?
не прав, а кроме того есть еще SetUnhandledExceptionFilter
Как много веселых ребят, и все делают велосипед...
Re: Завершение процесса
От: Pzz Россия https://github.com/alexpevzner
Дата: 03.02.11 16:34
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Как можно отследить завершение своего же процессе? Есть ли механизмы в windows для этого? Нужно удалить иконку с трея. Так как в программы может пойти исключение — нужно определить что она завершается и удалить самому.


Можно вынести этот код в DLL-ку. Их нотифицируют о том, что процесс от них отцепился. Правда, если процесс убъют вызовом TerminateProcess(), то это, к сожалению, не сработает.
Re[6]: Завершение процесса
От: Аноним  
Дата: 03.02.11 16:43
Оценка:
Здравствуйте, ononim, Вы писали:

O>>>Тогда почему AddVectoredExceptionHandler с FirstHandler=0 не подходит ?

А>>а разве это не просто последовательность вызовов векторных обработчиков исключений? Сначала идет вызов VEH, а потом SEH и вот в сехе идет обработка исключения. Вроде нету возможности узнать в veh что программа собралась падать или я не прав?
O>не прав, а кроме того есть еще SetUnhandledExceptionFilter

то есть, если AddVectoredExceptionHandler, FirstHandler=0 — то я получу управление перед тем, как приложение будет крешиться? а SetUnhandledExceptionFilter он же ставиться на поток, а мне нужно на процесс.
Re[7]: Завершение процесса
От: ononim  
Дата: 03.02.11 17:56
Оценка:
А>то есть, если AddVectoredExceptionHandler, FirstHandler=0 — то я получу управление перед тем, как приложение будет крешиться?
ну мона сказать и так

А>а SetUnhandledExceptionFilter он же ставиться на поток, а мне нужно на процесс.

и опять ты не прав
Как много веселых ребят, и все делают велосипед...
Re[8]: Завершение процесса
От: Аноним  
Дата: 03.02.11 18:28
Оценка:
Здравствуйте, ononim, Вы писали:

А>>то есть, если AddVectoredExceptionHandler, FirstHandler=0 — то я получу управление перед тем, как приложение будет крешиться?

O>ну мона сказать и так

сделал как вы написали и получил управление когда оно мне нах не нужно (call stack):


tst!TestExceptionHandler
ntdll!RtlpCallVectoredHandlers+0x7a
ntdll!RtlCallVectoredExceptionHandlers+0x12
ntdll!RtlDispatchException+0x19
ntdll!KiUserExceptionDispatcher+0xf
KERNELBASE!RaiseException+0x58
RPCRT4!RpcpRaiseException+0x6b
RPCRT4!RpcRaiseException+0x16
RPCRT4!NdrGetBuffer+0x47
RPCRT4!NdrClientCall2+0x17a
WINSTA!RpcGetSessionProtocolLastInputTime+0x19
WINSTA!GetSessionProtocolLastInputTime+0x65
WINSTA!_GetSessionProtocolLastInputTime+0x24
WINSTA!GetWinStationInformation+0x1d8
WINSTA!_tsrpcQuerySessionInfo+0x1c0
WINSTA!Public_WinStationQueryInformationW+0x11e
WINSTA!WinStationQueryInformationW+0x10f
WTSAPI32!WTSQuerySessionInformationW+0xa2



А>>а SetUnhandledExceptionFilter он же ставиться на поток, а мне нужно на процесс.

O>и опять ты не прав

а вы здесь уверены?
Re[9]: Завершение процесса
От: ononim  
Дата: 03.02.11 18:40
Оценка:
А>>>а SetUnhandledExceptionFilter он же ставиться на поток, а мне нужно на процесс.
O>>и опять ты не прав
А>а вы здесь уверены?
а вы мсдн почитайте
Как много веселых ребят, и все делают велосипед...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.