CreateProcess()启动子应用程序

时间:2013-01-13 09:10:11

标签: c++ c visual-c++

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

  1. 从主程序中启动了一个子.exe程序,没有子程序窗口
  2. 等待rand Sleep
  3. 然后首先终止子应用程序然后终止主。
  4. 在下面我的示例代码中,但是运行带窗口的子程序(在本例中为NotePad)并且我无法终止子程序。

    #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;
    
     }
    

1 个答案:

答案 0 :(得分:2)

记事本窗口显示的原因是因为它不是控制台应用程序。 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);