打开外壳/ CMD在C++
我想开在cmd标准Windows使用CreateProcessA(NULL, "cmd", NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
打开外壳/ CMD在C++
当执行程序,简单的控制台闪烁,然后消失 如何编程打开命令行,并使其开启用户输入任意命令?
您需要使用/k
选项cmd.exe
,保持开放的用户进入控制台窗口。下面的代码片段打开一个新的外壳控制台并等待用户使用exit
命令退出它:
STARTUPINFOA si;
ZeroMemory(&si,sizeof(STARTUPINFO));
si.cb = sizeof(si);
PROCESS_INFORMATION pi;
ZeroMemory(&pi, sizeof(pi));
char cmd_exe[32767];
GetEnvironmentVariable("COMSPEC", cmd_exe, 32767);
if (CreateProcessA(cmd_exe, "/k", NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi))
{
CloseHandle(pi.hThread);
WaitForSingleObject(pi.hProcess, INFINITE);
DWORD dwExitCode = 0;
GetExitCodeProcess(pi.hProcess, &dwExitCode);
CloseHandle(pi.hProcess);
std::cout << "cmd process exit code = " << dwExitCode << std::endl;
}
else
{
DWORD dwErrorCode = GetLastError();
std::cout << "cmd process not started, error = " << dwErrorCode << std::endl;
}
Windows文件夹的位置是在安装过程中由用户定义的,因此您应该使用GetEnvironmentVariable(”COMSPEC“)来获取正确的路径到'cmd.exe'。 –
@RemyLebeau:假设'cmd.exe'在PATH中,删除文件夹名称。 – shrike
请参阅我对布鲁诺关于该问题的回答的评论。 –
这是打开并等待处理状态代码进行更改:
if (CreateProcessA(NULL, "cmd.exe",
NULL, NULL, TRUE, 0, NULL,
NULL, &StartupInfo, &ProcessInfo))
{
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ProcessInfo.hProcess);
}
else
{
// Failed to launch ...
}
Downvoting。这个答案只显示了如何等待cmd窗口关闭,但没有做任何事情来解决OP关于如何在打开cmd窗口时立即关闭的问题。另外,如果不指定'cmd.exe'的完整路径,'CreateProcess()'不可能找到它:“*在部分名称的情况下,该函数使用当前驱动器和当前目录完成规范**该功能不会使用搜索路径**。*“ –
不知道是怎么回事,不完整的代码,但如果这是你在你的代码具有唯一,那么该进程在执行后立即终止,从而终止所有子进程。 在命令后添加一个循环,甚至更好的某种处理程序,如“WaitForSingleObject” – Makaronodentro
@Makaronodentro:*“因此杀死所有子进程”* - 不,这不是发生了什么。发生的事情是,当进程终止时,系统关闭从'CreateProcessW'返回的进程(和线程)句柄。由于这些是* cmd.exe *进程的最后一个打开的句柄,因此该进程将关闭。孩子/父母之间的关系一点也不令人感兴趣(并且在Windows中进行维护时,它不会用于任何有用的东西)。 – IInspectable