С++ получить идентификатор дочернего процесса из идентификатора родительского процесса

В Windows 10, если я создаю процесс для открытия calc.exe, сначала он запускает calc.exe и выходит из этого процесса, после чего открывается калькулятор.exe. Как я могу получить фактический идентификатор процесса, который отображается в диспетчере задач. я использую следующий код для создания процесса и отображения идентификатора процесса

if(!CreateProcess(("C:\\WINDOWS\\system32\\calc.exe"),
NULL,
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&startup_info,
&pi) )
{
 args.GetReturnValue().Set(Nan::New(response).ToLocalChecked());
}
else
{

int dwPid = GetProcessId(pi.hProcess);
int v = dwPid->Int32Value();
args.GetReturnValue().Set(dwPid);
}

person jack    schedule 09.01.2017    source источник
comment
использовать метод fork()   -  person GorvGoyl    schedule 09.01.2017
comment
@JerryGoyal fork — это функция POSIX, обычно недоступная в Windows (где ее можно эмулировать с помощью CreateProcess).   -  person Some programmer dude    schedule 09.01.2017
comment
Вы проверили dwPid? Разве это не правильно? Какое значение (например) возвращает GetProcessId и какое значение вы ожидали?   -  person Some programmer dude    schedule 09.01.2017
comment
да dwpid, показывающий идентификатор процесса calc.exe, от которого он отсоединяет calculate.exe. Мне нужен этот идентификатор процесса отсоединенного калькулятора.exe.   -  person jack    schedule 09.01.2017
comment
Кроме того, чего вы ожидали от dwPid->Int32Value()? Переменная dwPid уже является значением int. И как значение примитивного типа не имеет функций-членов. И это определенно не указатель.   -  person Some programmer dude    schedule 09.01.2017
comment
Не могли бы вы уточнить, что вы подразумеваете под отстраненным? Функция CreateProcess создает процесс, работающий отдельно от вашего. Он уже отсоединен (как я его вижу).   -  person Some programmer dude    schedule 09.01.2017
comment
я возвращаю это значение вызову функции node js, который я конвертирую, а не Int32value   -  person jack    schedule 09.01.2017
comment
отдельный процесс - это что-то вроде родительского процесса, создающего дочерний процесс   -  person jack    schedule 09.01.2017
comment
у меня есть код powershell, я ищу код С++, похожий на этот Get-WmiObject win32_process | где {$_.ParentProcessId -eq 17804 -and $_.ProcessName -ne 'conhost.exe' } |выбрать идентификатор процесса,имя_процесса   -  person jack    schedule 09.01.2017
comment
вы создаете процесс A, который выполняет процесс B и выходите. вы спрашиваете, как получить PID из B. мы можем перечислить процессы и сравнить PROCESSENTRY32.th32ParentProcessID с PIDa (не нужно закрывать дескриптор A процесса, чтобы удерживать его PIDa ) - таким образом мы получили PIDb. а что если B выполнить C и потом еще и выйти. а фактический расчет равен C или просто A фактический расчет?   -  person RbMm    schedule 09.01.2017
comment
Хорошо, вы имеете в виду, что дочерний процесс работает полностью отдельно от ссылки или трассировки parent.any?   -  person jack    schedule 09.01.2017
comment
Насколько я помню (из предыдущего вопроса о желании перечислить дочерние процессы), процесс/система не отслеживает дочерние процессы (процесса), а только родительский процесс. Я думаю, вам придется перечислять идентификаторы процессов и преследовать родительские процессы обратно к тому, который вы хотите (что, по-видимому, и делает сценарий PS), но вы должны сделать это до завершения CALC.EXE (из-за чего время не было бы никакой связи с вашим процессом).   -  person TripeHound    schedule 09.01.2017
comment
@TripeHound - but you'd have to do it before the CALC.EXE terminates - нет, пока мы не сохраним дескриптор процесса, даже если процесс завершен, он PID все еще действителен. поэтому мы можем искать его ребенка по этому PID   -  person RbMm    schedule 09.01.2017
comment
а за что вы GetProcessId(pi.hProcess); звоните?!? когда у вас уже есть PID вpi.dwProcessId. похожи близко pi.hProcess и pi.hThread ты даже не пытаешься   -  person RbMm    schedule 09.01.2017
comment
@RbMm Вы можете сохранить дескриптор завершенного процесса (чтобы вы могли проверить его код выхода и т. д.), но я подозреваю (но признаю, что не знаю наверняка), что когда CALC.EXE завершится, CALCULATOR.EXE больше не будет показывать этот PID как родительский.   -  person TripeHound    schedule 09.01.2017
comment
@RbMm для pi.dwProcessId я получаю эту ошибку, не могу преобразовать аргумент 1 из 'DWORD' в 'HANDLE и pi.hProcess, я получаю 0 в качестве возвращаемого значения   -  person jack    schedule 09.01.2017
comment
@TripeHound - вы ошибаетесь. PID освобождается, когда структура EPROCESS в ядре разрушается - она ​​уничтожается, когда на нее больше нет ссылок. пока мы не сохраним дескриптор(ссылку) на процесс - EPROCESS и его PID (поле UniqueProcessId в EPROCESS все еще действует. это точно. родительский процесс ID' also stored in EPROCESS` - InheritedFromUniqueProcessId и уже ни разу не менялся   -  person RbMm    schedule 09.01.2017
comment
@sandeepks - что ты пытаешься сделать? pi.dwProcessId — этоPID процесса, который вы создаете. если вам нужно PID, вам нужно использовать именно это поле. and pi.hProcess i am getting 0 ? если createprocess вернуть true - pi.hProcess != 0   -  person RbMm    schedule 09.01.2017


Ответы (1)


person    schedule
comment
Почему вы помещаете все идентификаторы в строку, затем разбиваете ее на вектор строки и снова конвертируете отдельные строки в длинные? - person Jimmy T.; 19.05.2021
comment
Честно говоря, я понятия не имею, почему я это сделал. Сейчас исправляю свой код. - person Samuel Joseph Venable; 20.05.2021
comment
@ДжиммиТ. исправленный. - person Samuel Joseph Venable; 20.05.2021