|
Как убить процесс iexplore.exe конкретной страницы или как получить PID. WinAPI | ☑ | ||
---|---|---|---|---|
0
ProgerLink
09.06.14
✎
00:16
|
Всем привет. Выручайте, сам уже "ни в какую".
IE: 9.0 OS: 7 Найстройки IE: без использования закладок, тобишь каждая открытая страница - отдельный процес в системе. Открыто несколько страниц объекта "InternetExplorer.Application". В определенный момент времени необходимо убить процесс конкретный страницы, именно убить, а не вызвать "Quit()", висит диалог ожидающий ответа от пользователя. Через свойство IE "Handle" пытался определить PID через "GetWindowThreadProcessId", но фишка в том что получаю PID процесса родителя iexplore.exe, убив который закрываются все окна IE. Таким образом любая открытая страницы возвращает мне PID именно процесса родителя, а количество процессов в системе равно количество открытых страниц (окон) +1(родитель). ID потока получаемый через GetWindowThreadProcessId уникален для каждой страницы (окна), но в итоге через "CreateToolhelp32Snapshot, Thread32First, Thread32Next" выходил на все тот же процесс родитель. Летает идея в голове выполнить "GetCurrentProcessId" со стороны объекта IE, но как это сделать не знаю. Для вызова API функций использую DynamicWrapperX. Коллеги выручайте, нужен совет ваших светлых голов. |
|||
1
ProgerLink
09.06.14
✎
11:08
|
ыть
|
|||
2
H A D G E H O G s
09.06.14
✎
11:31
|
1)
Через свойство IE "Handle" пытался определить PID через "GetWindowThreadProcessId", но фишка в том что получаю PID процесса родителя iexplore.exe, убив который закрываются все окна IE. - да! 2) Только что открыл IE в msspy32 - там совершенно пиз^&*&дская оконная модель. Все вкладки - это окна, имеющие свой отдельный ПРОЦЕСС, не ПОТОК, причем 32-х разрядный. Главное окно принадлежит основному процессу, он - 64-х разрядный. При этом окна вкладок принадлежат окну главного процесса. Это писдец как запутанно с т.з. "классики", но красиво. |
|||
3
dmpl
09.06.14
✎
11:35
|
Мне одному кажется, что это индусский стиль программирования?
|
|||
4
H A D G E H O G s
09.06.14
✎
11:36
|
Я так думаю, "свойство IE "Handle"" - это дескриптор главного окна главного процесса, тот, который 64 разрядный...
Автор, делай: 1) Возьми ms spy 32, изучи структуру окон. 2) Для Окна с дескриптором "свойство IE "Handle"" попробуй вызвать FindWindowEx() по четкому поиску по заголовку закрываемой вкладки, либо call-back EnumChildWindow() по нечеткому поиску. 3) Для найденного Handle закрываемой вкладки вызывай CloseWindow(), а не поиск PID, OpenProcess(), TerminateProcess(), ибо это падение процесса и главный процесс все восстановит :-) Удачи тебе и терпения. |
|||
5
H A D G E H O G s
09.06.14
✎
11:37
|
(3) Нет. Это шикарное решение ограничения по памяти, я так смотрю.
|
|||
6
H A D G E H O G s
09.06.14
✎
11:39
|
(3) Вкладка - процесс набрала "загрань", за 3.5 гига и ее процесс - отвалился. Небеда, бормочет главный 64-х разрядный процесс- менеджер и восстанавливает (запускает новый) процесс для вкладки.
Привяжи вкладки к потокам - падение 1-ого окна - вкладки приведет к падению всех остальных вкладок. |
|||
7
dmpl
09.06.14
✎
11:41
|
(5) Я про (0). Из одного юзерского процесса лезть прибивать другой юзерский процесс - так недолго и до отнесения к вредоносному ПО докатиться...
|
|||
8
H A D G E H O G s
09.06.14
✎
11:41
|
И, по дефолту - все вкладки - в отдельных окнах и все хорошо, классика.
Но потом, походу (неследил за развитием IE) - народ стал требовать "все в одном окне, как было раньше". И MS запилил это чудо |
|||
9
dmpl
09.06.14
✎
11:43
|
(8) Памяти, кстати, это чудо жрет будь здоров... 20-50-100 Мб на вкладку - влегкую. Меньше только какая-нибудь простенькая страничка почти без форматирования...
|
|||
10
ProgerLink
09.06.14
✎
16:46
|
О аллилуя! Мне это удалось сделать. Выход был по совету коллеги изучить структуру окон, найти окно которое можно выловить по заголовку конкретной страницы и которое принадлежит процессу не родителю. В итоге 2 поиска через "FindWindowExW", получив хэндл конечного окна получил PID нужного процесса, из него хэндл процесса и в TerminateProcess.
Честь светлой головы по праву заслужил "H A D G E H O G s". Благодарю!!! |
|||
11
H A D G E H O G s
09.06.14
✎
17:04
|
(10) После TerminateProcess() ie не перезапускает его заново?
|
|||
12
ProgerLink
09.06.14
✎
17:09
|
Привет. Перезапускается, но это это средство защиты IE, просто его отключил в свойствах обозревателя
|
|||
13
ProgerLink
09.06.14
✎
17:09
|
Кстати раз уж тут, подскажи мне, после терминатора, память освобождается полностью ?
|
|||
14
H A D G E H O G s
09.06.14
✎
17:14
|
(13) Ну да. Ты же убиваешь процесс. Тут ничего такого нет.
А родительский процесс IE должен такое предусматривать, не такие там балбесы сидят, как о них пишут. |
|||
15
MM
09.06.14
✎
17:27
|
(14) Так не рекомендуется пользоваться TerminateProcess, например, асинхронный ввод-вывод он не отменяет, закрепление страниц в памяти, вроде тоже.
|
|||
16
Serginio1
09.06.14
✎
17:40
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |