C++ C++;从父进程id获取子进程id
在windows 10中,如果我创建一个进程以首先打开calc.exe,它将触发calc.exe并退出该进程,然后它将打开calculator.exe。如何获取任务管理器中显示的实际流程id。 我使用以下代码创建进程并显示进程idC++ 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
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
execC
,然后也退出呢。而实际的计算是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
execC
,然后也退出呢。而实际的计算是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;
}