Windows启动过程(带有/不带有控制台)

时间:2018-11-08 22:41:12

标签: c windows

我在应用程序中使用c system()函数来启动如下命令:

cmd.exe /c a.bat
guiapp.exe
consoleapp.exe

它可以工作,但是,system()在显示控制台的情况下启动guiapp.exe(显然,此gui应用程序未使用该控制台)。考虑到我不知道要启动的进程是否应该显示控制台的事实,如何启动新进程?我希望以与双击鼠标时启动过程相同的方式启动该过程。

1 个答案:

答案 0 :(得分:3)

您可以使用CreateProcess,并且在dwFlags参数中不要将CREATE_NEW_CONSOLE指定为标志之一。

这样,如果应用程序是GUI应用程序,它将不会启动控制台窗口;如果是控制台应用程序,它将在与启动过程相同的控制台中运行。

示例代码:

#include <Windows.h>
#include <stdio.h>

int main(void)

{
    PROCESS_INFORMATION pi, pi2;
    STARTUPINFO si, si2;

    ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
    ZeroMemory(&si, sizeof(STARTUPINFO));

    si.cb = sizeof(STARTUPINFO);

    CreateProcessW(L"C:\\GUIAppDir\\GUIApp.exe", L"program-arguments-here", NULL, NULL, FALSE, CREATE_UNICODE_ENVIRONMENT, NULL, L"C:\\GUIAppDir", &si, &pi);

    ZeroMemory(&pi2, sizeof(PROCESS_INFORMATION));
    ZeroMemory(&si2, sizeof(STARTUPINFO));

    si2.cb = sizeof(STARTUPINFO);
    CreateProcessW(L"C:\\ConsoleAppDir\\ConsoleApp.exe", L"program-arguments-here", NULL, NULL, FALSE, CREATE_UNICODE_ENVIRONMENT, NULL, L"C:\\ConsoleAppDir", &si2, &pi2);
    WaitForSingleObject(pi2.hProcess, INFINITE);
    CloseHandle(pi2.hThread);
    CloseHandle(pi2.hProcess);
    WaitForSingleObject(pi.hProcess, INFINITE);
    CloseHandle(pi.hThread);
    CloseHandle(pi.hProcess);

    return 0;
}