В 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);
}
fork
— это функция POSIX, обычно недоступная в Windows (где ее можно эмулировать с помощьюCreateProcess
). - person Some programmer dude   schedule 09.01.2017dwPid
? Разве это не правильно? Какое значение (например) возвращаетGetProcessId
и какое значение вы ожидали? - person Some programmer dude   schedule 09.01.2017dwPid->Int32Value()
? ПеременнаяdwPid
уже является значениемint
. И как значение примитивного типа не имеет функций-членов. И это определенно не указатель. - person Some programmer dude   schedule 09.01.2017CreateProcess
создает процесс, работающий отдельно от вашего. Он уже отсоединен (как я его вижу). - person Some programmer dude   schedule 09.01.2017A
, который выполняет процессB
и выходите. вы спрашиваете, как получитьPID
изB
. мы можем перечислить процессы и сравнитьPROCESSENTRY32.th32ParentProcessID
сPIDa
(не нужно закрывать дескрипторA
процесса, чтобы удерживать егоPIDa
) - таким образом мы получилиPIDb
. а что еслиB
выполнитьC
и потом еще и выйти. а фактический расчет равенC
или простоA
фактический расчет? - person RbMm   schedule 09.01.2017CreateProcess
a> делает! Процесс, вызвавшийCreateProcess
, станет родительским процессом, а новый процесс — дочерним процессом. И дочерний процесс выполняется отдельно от родительского процесса. Так что не вижу в чем проблема. Может, дело не в функцииCreateProcess
, а в чем-то другом? Например, как вы возвращаете значение в узел? - person Some programmer dude   schedule 09.01.2017but you'd have to do it before the CALC.EXE terminates
- нет, пока мы не сохраним дескриптор процесса, даже если процесс завершен, онPID
все еще действителен. поэтому мы можем искать его ребенка по этомуPID
- person RbMm   schedule 09.01.2017GetProcessId(pi.hProcess);
звоните?!? когда у вас уже естьPID
вpi.dwProcessId
. похожи близкоpi.hProcess
иpi.hThread
ты даже не пытаешься - person RbMm   schedule 09.01.2017PID
освобождается, когда структураEPROCESS
в ядре разрушается - она уничтожается, когда на нее больше нет ссылок. пока мы не сохраним дескриптор(ссылку) на процесс -EPROCESS
и егоPID
(полеUniqueProcessId
вEPROCESS
все еще действует. это точно. родительский процессID' also stored in
EPROCESS` -InheritedFromUniqueProcessId
и уже ни разу не менялся - person RbMm   schedule 09.01.2017pi.dwProcessId
— этоPID
процесса, который вы создаете. если вам нужноPID
, вам нужно использовать именно это поле.and pi.hProcess i am getting 0
? еслиcreateprocess
вернутьtrue
-pi.hProcess != 0
- person RbMm   schedule 09.01.2017