C++ 我无法使用TerminateProcess杀死子进程

C++ 我无法使用TerminateProcess杀死子进程,c++,createprocess,C++,Createprocess,使用TerminateProcess杀死子进程时遇到问题。我调用了这个函数,进程仍然在那里(在任务管理器中)。这段代码被多次调用,多次启动同一个program.exe,而这些进程存在于任务管理器中,我认为这并不好。 实际上始终创建两个进程:program.exe和conhost.exe 我真的很感激任何帮助 代码如下: STARTUPINFO childProcStartupInfo; memset( &childProcStartupInfo, 0, sizeof(childProcS

使用
TerminateProcess
杀死子进程时遇到问题。我调用了这个函数,进程仍然在那里(在任务管理器中)。这段代码被多次调用,多次启动同一个program.exe,而这些进程存在于任务管理器中,我认为这并不好。 实际上始终创建两个进程:program.exe和conhost.exe

我真的很感激任何帮助

代码如下:

STARTUPINFO childProcStartupInfo;
memset( &childProcStartupInfo, 0, sizeof(childProcStartupInfo));
childProcStartupInfo.cb = sizeof(childProcStartupInfo);
childProcStartupInfo.hStdInput = hFromParent;   // stdin
childProcStartupInfo.hStdOutput = hToParent;    //  stdout
childProcStartupInfo.hStdError = hToParentDup;  // stderr
childProcStartupInfo.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
childProcStartupInfo.wShowWindow = SW_HIDE;


PROCESS_INFORMATION childProcInfo;  /* for CreateProcess call */



bOk = CreateProcess(
    NULL,           // filename
    pCmdLine,   // full command line for child
    NULL,           // process security descriptor */
    NULL,           // thread security descriptor */
    TRUE,           // inherit handles? Also use if STARTF_USESTDHANDLES */
    0,              // creation flags */
    NULL,           // inherited environment address */
    NULL,           // startup dir; NULL = start in current */
    &childProcStartupInfo,          // pointer to startup info (input) */
    &childProcInfo);            // pointer to process info (output) */

CloseHandle( hFromParent );
CloseHandle( hToParent );
CloseHandle( hToParentDup );

CloseHandle( childProcInfo.hThread);
CloseHandle( childProcInfo.hProcess);

TerminateProcess( childProcInfo.hProcess ,0);  //this is not working, the process 

我知道有两个可能的原因:

  • 您不能杀死在不同安全上下文下运行的进程,而不是调用TerminateProcess()的进程
  • 过程是模式(例如,驱动程序未完成的一些I/O操作等)-我相信这是Vista引入的,但我可能错了

第二个是我的想法。嗨,Zdelav,谢谢你的快速回复,事实上,当TerminateProcess执行时,我没有收到任何消息错误(共享链接正在讨论这一点)。我正在使用Windows Vista。哪些链接?任务管理器显示错误“访问被拒绝”
TerminateProcess
返回BOOL,您可以调用
GetLastError
检查原因。如果您将
GetLastError
的返回值存储到某个变量
err
中,并在调试器中添加一个类似
err,hr
的监视,您还将看到描述或错误。TerminateProcess的响应为0,消息为“句柄无效”这意味着什么?这意味着您刚刚关闭了该句柄,因此它是无效的。进程句柄已经通过
CloseHandle
关闭,因此
TerminateProcess
将永远不会成功。嗨,Jay,谢谢你,这是一个好的观点,我删除了,我认为正在工作。但是我还有一个问题,这个terminateprocess函数应该放在哪里,因为这个进程应该在这个进程结束时终止。