我在应用程序中使用c system()函数来启动如下命令:
cmd.exe /c a.bat
guiapp.exe
consoleapp.exe
它可以工作,但是,system()在显示控制台的情况下启动guiapp.exe(显然,此gui应用程序未使用该控制台)。考虑到我不知道要启动的进程是否应该显示控制台的事实,如何启动新进程?我希望以与双击鼠标时启动过程相同的方式启动该过程。
答案 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;
}