Отслеживание процессов, запускаемых другим процессом

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Drag
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 85
Зарегистрирован: 29.01.2005 (Сб) 23:54
Откуда: Москва

Отслеживание процессов, запускаемых другим процессом

Сообщение Drag » 26.03.2010 (Пт) 17:11

Приветствую всех. Помогите, пожалуйста, с такой проблемой - смысл в том, что моя программа запускает другую программу по ярлыку:
Код: Выделить всё
    Dim SHInfo As SHELLEXECUTEINFO
    SHInfo.hWnd = Me.hWnd
    SHInfo.lpVerb = "open"      'Нам надо открыть файл
    SHInfo.cbSize = LenB(SHInfo)    'Указываем размер всей структуры
    SHInfo.lpFile = LNK_PATH & Item.Key & ".lnk"    'Формируем полный путь к ярлыку
    SHInfo.fMask = SEE_MASK_NOCLOSEPROCESS  'Это указываем, что хотим следить за окончанием процесса...
    SHInfo.nShow = SW_SHOW
    Call ShellExecuteEx(SHInfo)     'Собственно, запускаем

И затем ожидает окончания его выполнения. Но проблема в том, что другая программа запускает другой процесс, а сама завершается. И я хотел спросить - можно ли как-то при ожидании завершения процесса учитывать не только данный процесс, но также процессы, запущенные этим процессом? Понятно, что для этого надо использовать WaitForMultipleObjects, но вот как получить хэндлы на другие процессы, я не знаю.
Единственное, что мне приходит в голову - после завершения ожидания просмотреть все процессы, проверяя их родительский процесс, и ждать и его завершения... Но не думаю, что это правильный выход...
Я не сплю, я перешел в режим замедленного функционирования.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Отслеживание процессов, запускаемых другим процессом

Сообщение Twister » 26.03.2010 (Пт) 19:06

Понятно, что для этого надо использовать WaitForMultipleObjects, но вот как получить хэндлы на другие процессы, я не знаю.
Перечислить дочерние процессы, открыть каждый из них, получив хэнлды, и ждать. Я так понимаю Вам способ перечисления процессов? Тогда Вам сюда.
А я все практикую лечение травами...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Отслеживание процессов, запускаемых другим процессом

Сообщение Хакер » 26.03.2010 (Пт) 21:26

Зачем сразу туда?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Отслеживание процессов, запускаемых другим процессом

Сообщение Twister » 27.03.2010 (Сб) 8:37

Зачем сразу туда?
Там есть несколько способов перечислить процессы :)
А я все практикую лечение травами...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Отслеживание процессов, запускаемых другим процессом

Сообщение Хакер » 27.03.2010 (Сб) 9:07

Вполне достаточно тулхелп-снапшота.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Отслеживание процессов, запускаемых другим процессом

Сообщение Twister » 27.03.2010 (Сб) 9:44

Вполне достаточно тулхелп-снапшота.
Угу. Но я же всегда стараюсь дать дополнительную информацию для расширения кругозора :D
А я все практикую лечение травами...

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Отслеживание процессов, запускаемых другим процессом

Сообщение SLIM » 28.03.2010 (Вс) 11:01

Twister писал(а):Угу. Но я же всегда стараюсь дать дополнительную информацию для расширения кругозора :D

Отличная статья!!! Твои старания оправданы
Пишите жизнь на чистовик.....переписать не удастся.....

Drag
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 85
Зарегистрирован: 29.01.2005 (Сб) 23:54
Откуда: Москва

Re: Отслеживание процессов, запускаемых другим процессом

Сообщение Drag » 24.04.2010 (Сб) 22:02

Спасибо! :). Извиняюсь за долгое молчание, только сейчас нашлось время... Правда, подобное не для всего подошло, так как некоторые запускаемые программы делают просто пинг-понг запусков, которые отследить вряд ли получится, так что, думаю, лучше будет искать нужный исполняемый файл в списке запущенных процессов...
И вопрос немного не в тему, но все же...
После этого кода я получаю handle созданного процесса с помощью SHInfo.hProcess. В Windows 7 это работает, а вот в Windows XP по какой-то причине все время возвращается 0, хотя процесс успешно запускается и функция возвращает ненулевое значение. Если не трудно, подскажите, как быть? Не хочется верить, что это из-за разных версий shell32.dll.
И да, ShellExecuteEx мне пришлось использовать по той причине, что только она умеет запускать ярлыки и одновременно умеет получать handle процесса.
Я не сплю, я перешел в режим замедленного функционирования.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Отслеживание процессов, запускаемых другим процессом

Сообщение Twister » 27.04.2010 (Вт) 9:27

Тут надо на код смотреть.
А я все практикую лечение травами...

Drag
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 85
Зарегистрирован: 29.01.2005 (Сб) 23:54
Откуда: Москва

Re: Отслеживание процессов, запускаемых другим процессом

Сообщение Drag » 27.04.2010 (Вт) 10:27

Ну, код я написал в первом посте. Проблему удалось решить, извлекая путь с параметрами из ярлыка и используя Shell. Но все же интересно - из-за чего же так...
Если все же нужен полный код - вечером выложу :).
Я не сплю, я перешел в режим замедленного функционирования.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Отслеживание процессов, запускаемых другим процессом

Сообщение Twister » 27.04.2010 (Вт) 12:25

Не обязательно hProcess будет заполнен, даже с указанием флага SEE_MASK_NOCLOSEPROCESS. В мсдн же все написано:
hProcess
HANDLE

A handle to the newly started application. This member is set on return and is always NULL unless fMask is set to SEE_MASK_NOCLOSEPROCESS. Even if fMask is set to SEE_MASK_NOCLOSEPROCESS, hProcess will be NULL if no process was launched. For example, if a document to be launched is a URL and an instance of Internet Explorer is already running, it will display the document. No new process is launched, and hProcess will be NULL.

Note ShellExecuteEx does not always return an hProcess, even if a process is launched as the result of the call. For example, an hProcess does not return when you use SEE_MASK_INVOKEIDLIST to invoke IContextMenu.
А я все практикую лечение травами...


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Mail.ru [бот] и гости: 8

    TopList