CreateProcess() 启动子应用程序

Posted

技术标签:

【中文标题】CreateProcess() 启动子应用程序【英文标题】:CreateProcess() launching child applications 【发布时间】:2013-01-13 09:10:10 【问题描述】:

我想使用 CreateProcess 函数从主应用程序启动子应用程序,步骤如下:

    从没有子程序窗口的主程序启动了一个子程序.exe 等待rand Sleep 然后先终止子应用程序,然后再终止主程序。

在下面我的示例代码中,但子程序与窗口一起运行(在本例中为记事本),我无法终止子程序。

#include "stdafx.h"
#include <windows.h>
#include <conio.h>
#include <strsafe.h>
#include <direct.h>
#include <string.h>

int main(int argc, char* argv[])
   

HWND                hWnd;
STARTUPINFO         sInfo;
PROCESS_INFORMATION pInfo;

ZeroMemory(&sInfo, sizeof(sInfo));
sInfo.cb = sizeof(sInfo);
ZeroMemory(&pInfo, sizeof(pInfo));

if (CreateProcess("C:\\WINDOWS\\System32\\notepad.exe", NULL, NULL, NULL, false, CREATE_NO_WINDOW, NULL, NULL, &sInfo, &pInfo))

    printf("Sleeping 100ms...\n");
    Sleep(100);

    DWORD dwExitCode;
    GetExitCodeProcess(pInfo.hProcess, &dwExitCode);

    CloseHandle(pInfo.hThread);
    CloseHandle(pInfo.hProcess);

    

system("pause");

return 0;

 

【问题讨论】:

@chris 要使用 TerminateProcess 我必须知道 PID,那么在这种情况下如何获取进程 PID。 我将我的 cmets 和建议移至答案。请注意,您需要的是句柄,而不是进程 ID。 【参考方案1】:

记事本窗口显示的原因是它不是控制台应用程序。 MSDN 这么说 CREATE_NO_WINDOW:

该进程是一个在没有控制台窗口的情况下运行的控制台应用程序。因此,未设置应用程序的控制台句柄。 如果应用程序不是控制台应用程序,则忽略此标志,或者如果它与 CREATE_NEW_CONSOLE 或 DETACHED_PROCESS 一起使用。

改为使用您传入的STARTUPINFO

sInfo.dwFlags = STARTF_USESHOWWINDOW;
sInfo.wShowWindow = SW_HIDE;

我相信这会影响记事本主函数中WinMain 的最后一个参数,但我不确定。

至于记事本为什么不关闭,GetExitCodeProcess实际上并没有结束进程,它只是检索状态。你可以改用TerminateProcess

TerminateProcess(pInfo.hProcess, 0);

【讨论】:

以上是关于CreateProcess() 启动子应用程序的主要内容,如果未能解决你的问题,请参考以下文章

在 CreateProcess 之后修改 STARTUPINFO

CreateProcess() C++ 文件未找到

如何启动具有特定访问权限的子进程

CreateProcess 不会使用参数启动进程

如何获得CreateProcess启动的进程返回的结果

无法启动应用程序(CreateProcess 错误=87),不能使用缩短类路径解决方法