C++ C++;从父进程id获取子进程id

C++ C++;从父进程id获取子进程id,c++,visual-c++,windows-10,createprocess,C++,Visual C++,Windows 10,Createprocess,在windows 10中,如果我创建一个进程以首先打开calc.exe,它将触发calc.exe并退出该进程,然后它将打开calculator.exe。如何获取任务管理器中显示的实际流程id。 我使用以下代码创建进程并显示进程id if(!CreateProcess(("C:\\WINDOWS\\system32\\calc.exe"), NULL, NULL, NULL, FALSE, 0, NULL, NULL, &startup_info, &pi) ) { args.G

在windows 10中,如果我创建一个进程以首先打开calc.exe,它将触发calc.exe并退出该进程,然后它将打开calculator.exe。如何获取任务管理器中显示的实际流程id。 我使用以下代码创建进程并显示进程id

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);
}
#包括
#包括
#包括
#包括
#包括
使用std::vector;
使用std::cout;
使用std::endl;
矢量pids_自_ppid(DWORD ppid){
矢量PID;
HANDLE hp=CreateToolhelp32Snapshot(TH32CS\u SNAPPROCESS,0);
PROCESSENTRY32 pe={0};
pe.dwSize=sizeof(PROCESSENTRY32);
if(Process32First(hp和pe)){
做{
if(pe.th32ParentProcessID==ppid){
pids.推回(pe.th32ProcessID);
}
}while(Process32Next(hp和pe));
}
闭合手柄(hp);
返回PID;
}
int main(int argc,char*argv[]){
如果(弧>=2){
DWORD-ppid=(DWORD)strtoul(argv[1],nullptr,10);
向量pidVec=pids_from_ppid(ppid);
对于(int i=0;i=2){
DWORD-ppid=(DWORD)strtoul(argv[1],nullptr,10);
向量pidVec=pids_from_ppid(ppid);
对于(int i=0;i不能使用fork()方法同样,您希望得到什么
dwPid->Int32Value()
要做什么?变量
dwPid
已经是一个
int
值。作为一个原语类型的值,它没有成员函数。而且它肯定不是指针。您创建进程
a
哪个执行进程
B
并退出。您询问如何获取
B
PID
。我们可以枚举进程es并将
PROCESSENTRY32.th32ParentProcessID
PIDa
进行比较(无需关闭
A
进程的句柄以保持它
PIDa
)-这样我们得到了
PIDb
。但是如果
B
exec
C
,然后也退出呢。而实际的计算是
C
或者只是
A
实际的计算?这正是我们要做的!调用
CreateProcess
的进程将成为父进程,而新进程则是子进程。而child进程与父进程分开运行。因此我不知道问题出在哪里。可能它与
CreateProcess
函数无关,但与其他功能有关?例如,如何将值“返回”到节点?据我所知(来自上一个要枚举子进程的问题),进程/系统不跟踪(进程的)子进程,只跟踪进程的父进程。我认为,您必须枚举进程ID,并将父进程追回到您想要的进程(这可能是PS脚本所做的),但您必须在CALC.EXE终止之前完成使用fork()方法同样,您期望的是什么
dwPid->Int32Value()
要做什么?变量
dwPid
已经是一个
int
值。作为一个原语类型的值,它没有成员函数。而且它肯定不是指针。您创建进程
a
哪个执行进程
B
并退出。您询问如何获取
B
PID
。我们可以枚举进程es并将
PROCESSENTRY32.th32ParentProcessID
PIDa
进行比较(无需关闭
A
进程的句柄以保持它
PIDa
)-这样我们得到了
PIDb
。但是如果
B
exec
C
,然后也退出呢。而实际的计算是
C
或者只是
A
实际的计算?这正是我们要做的!调用
CreateProcess
的进程将成为父进程,而新进程则是子进程。而child进程与父进程分开运行。因此我不知道问题出在哪里。可能它与
CreateProcess
函数无关,但与其他功能有关?例如,如何将值“返回”到节点?据我所知(来自上一个要枚举子进程的问题),进程/系统不跟踪(进程的)子进程,只跟踪进程的父进程。我认为,您必须枚举进程ID,并将父进程追回到您想要的进程(这可能是PS脚本所做的),但您必须在CALC.EXE终止之前完成(此时将与您的流程没有关联)。为什么你要把所有ID放在一个字符串中,然后把它拆分成一个字符串向量,再把虚拟字符串转换成long?老实说,我不知道我为什么要这么做。现在更正我的代码。@JimmyT.corrected。为什么你要把所有ID放在一个字符串中,然后把它拆分成字符串向量,然后把虚拟字符串转换成lon又是g?老实说,我不知道我为什么这么做。现在更正我的代码。@JimmyT。更正。
#include <iostream>
#include <vector>

#include <cstring>

#include <windows.h>
#include <tlhelp32.h>

using std::vector;
using std::cout;
using std::endl;

vector<DWORD> pids_from_ppid(DWORD ppid) {
  vector<DWORD> pids;
  HANDLE hp = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  PROCESSENTRY32 pe = { 0 };
  pe.dwSize = sizeof(PROCESSENTRY32);
  if (Process32First(hp, &pe)) {
    do {
      if (pe.th32ParentProcessID == ppid) {
        pids.push_back(pe.th32ProcessID);
      }
    } while (Process32Next(hp, &pe));
  }
  CloseHandle(hp);
  return pids;
}

int main(int argc,char *argv[]) {
  if (arc >= 2) {
    DWORD ppid = (DWORD)strtoul(argv[1], nullptr, 10);
    vector<DWORD> pidVec = pids_from_ppid(ppid);
    for (int i = 0; i < pidVec.size(); i++) {
      cout << pidVec[i] << endl;
    }
  }
  return 0;
}