Как можно получить PID, если есть hProcess? Ситуация такова: стартует приложение через ShellExecuteEx. Что это за приложение — заранее неизвестно, так как в ShellExecuteEx я передаю путь к файлу, который требуется открыть.
Далее необходимо послать сообщение окну того приложения, которое запустилось для открытия этого файла. После запуска процесса я делаю EnumWindows, а в функции EnumWindowsProc получаю PID процесса, в котором каждое окошко создано — GetWindowThreadProcessId. Один из этих PID — тот, который запустила ShellExecuteEx. По идее, их надо бы сравнить, но у меня на выходе ShellExecuteEx есть hProcess, а не пид. Как быть? Единственный способ узнать пид запущенного процесса, как я понял — вызвать CreateProcess и пид будет возвращен в структуре PROCESS_INFORMATION.
Кто поможет?
--------------------
PS.
Мной были испробован такой способ: (не смеяться!)
Моя прога:
1. Перед запуском процесса через ШелЕкзек я регистрю переменную окружения, допустим RunnerInvoked=1.
2. Создаю именованные объекты — событие и FileMapping.
3. Рождаю процесс через ЩелЕкзек, регистрю хук WH_GETMESSAGE.
4. Ожидаю поднятия события.
Теперь перенесемся в другой процесс

:
5. Хук обрабатывается в DLL в которой сидит функция-обработчик хука WH_GETMESSAGE. Кроме того, при загрузке в процесс эта DLL проверяет переменную окружения RunnerInvoked и таким образом определяет, тот ли это процесс, который родился из под ShellExec. Ибо в остальные процессы эта длл тоже будет загружена. Переменная окружения от родителя наследуется только в тот процесс, который мне нужен

.
6. Далее, если есть такая переменная, открываю именованный FileMapping и вписываю туда GetCurrentProcessId. Подымаю евент. Все.
А тут просыпается первоначальная прога, так как евент был поднят при загрузке длл в процесс, рожденный из под шел екзек:
7. Вычитываем из FileMapping значение пида.
Теперь я имею пид запущенного процесса, через такую вот задницу

.
Верю, что есть способы получше (передавать PID через реестр с использованием выше описанной технологии не предлагать).