Имя: Пароль:
1C
1С v8
Как убить процесс 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
2 + 2 = 3.9999999999999999999999999999999...