打开外壳/ CMD在C++

问题描述:

我想开在cmd标准Windows使用CreateProcessA(NULL, "cmd", NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);打开外壳/ CMD在C++

当执行程序,简单的控制台闪烁,然后消失 如何编程打开命令行,并使其开启用户输入任意命令?

+0

不知道是怎么回事,不完整的代码,但如果这是你在你的代码具有唯一,那么该进程在执行后立即终止,从而终止所有子进程。 在命令后添加一个循环,甚至更好的某种处理程序,如“WaitForSingleObject” – Makaronodentro

+0

@Makaronodentro:*“因此杀死所有子进程”* - 不,这不是发生了什么。发生的事情是,当进程终止时,系统关闭从'CreateProcessW'返回的进程(和线程)句柄。由于这些是* cmd.exe *进程的最后一个打开的句柄,因此该进程将关闭。孩子/父母之间的关系一点也不令人感兴趣(并且在Windows中进行维护时,它不会用于任何有用的东西)。 – IInspectable

您需要使用/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; 
} 
+1

Windows文件夹的位置是在安装过程中由用户定义的,因此您应该使用GetEnvironmentVariable(”COMSPEC“)来获取正确的路径到'cmd.exe'。 –

+0

@RemyLebeau:假设'cmd.exe'在PATH中,删除文件夹名称。 – shrike

+0

请参阅我对布鲁诺关于该问题的回答的评论。 –

这是打开并等待处理状态代码进行更改:

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 ... 
} 
+0

Downvoting。这个答案只显示了如何等待cmd窗口关闭,但没有做任何事情来解决OP关于如何在打开cmd窗口时立即关闭的问题。另外,如果不指定'cmd.exe'的完整路径,'CreateProcess()'不可能找到它:“*在部分名称的情况下,该函数使用当前驱动器和当前目录完成规范**该功能不会使用搜索路径**。*“ –