如何使用QProcess在控制台窗口中启动和终止cmd.exe
How to launch and later terminate cmd.exe in a console window with QProcess
我需要通过QProcess运行一个可见的cmd.exe窗口,并最终终止它。shell的控制台窗口必须位于前台,并且必须对用户可见。
如果我使用QProcess::start()
启动它,控制台窗口永远不会出现。如果我使用类方法QProcess::startDetached()
来启动它,我就不能使用实例方法terminate()
来终止它。
在Windows上,QProcess
有两种操作模式:
-
正常模式,当你使用实例方法,如
start()
。在这种模式下,QProcess
本身是正在运行的应用程序的控制台,如果它请求一个的话。这个控制台是一个逻辑对象(类似于Unix上的伪tty),没有可见的外观。 -
使用类方法
startDetached
时的分离模式。如果正在运行的进程请求一个控制台,Windows为它提供一个控制台窗口。
因此,要利用windows提供的控制台窗口,唯一的选择是分离启动。
如果您希望一个人在cmd.exe
执行您的命令后留下一个打开的控制台窗口,则适用以下命令:
-
每个传递执行的命令都需要以
/k
开头 -
/k
和命令是单独的参数
要在应用程序退出时终止进程,可以使用以下类的实例,使其成为应用程序实例的子实例:
#include <windows.h>
...
class ProcessKiller : public QObject {
qint64 m_pid;
public:
ProcessKiller(qint64 pid, QObject * parent = 0) :
QObject(parent), m_pid(pid) {}
~ProcessKiller() {
HANDLE hApp = OpenProcess(PROCESS_QUERY_INFORMATION
| PROCESS_TERMINATE, FALSE, m_pid);
if (hApp == NULL) return;
TerminateProcess(hApp, NULL);
CloseHandle(hApp);
}
}
因此,要在windows提供的控制台窗口中以两个echo
命令开始运行cmd.exe
,并在应用程序退出时杀死它,将是:
qint64 pid;
QProcess::startDetached("cmd.exe", QStringList()
<< "/k" << "echo foo"
<< "/k" << "echo bar",
QDir::currentPath(), &pid);
new ProcessKiller(pid, qApp);
下面的代码将解决我的问题:
qint64 pID;
QProcess *myProcess = new QProcess(this);
QStringList arguments;
arguments << "/k cd /d " << "c:path to be opened";
myProcess->startDetached("cmd.exe", arguments, "", &pID);
...
...
QString pidString;
pidString.setNum(pID);
QString killProcessUsingPid = "taskkill /PID ";
killProcessUsingPid.append(pidString);
system(killProcessUsingPid.toStdString().c_str());
相关文章:
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 如何创建一个空的全局类并在启动时实例化它
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 我收到以下错误:抛出'std::bad_alloc'实例后终止调用
- 为什么这个 c++ 代码打印出长度 5,当我打印出字符串时,程序会自动终止?
- 终止计时器由 startTimer() 启动
- 如何防止程序输出终止并重新启动程序而不会丢失数据
- Eclipse C++ 调试器不会在断点处停止,而是在调试启动后立即终止
- 在跨平台C++启动和终止进程
- QT:无法在启动/停止按钮中终止 Qprocess
- WIN 32 用于检测已启动和终止的应用程序/进程的 API
- 程序终止几秒钟后重新启动
- 使用SIGHUP重新启动终止进程
- C++ 游戏启动终止在抛出"std::out_of_range"实例后调用
- OpenCV C++应用程序在从Eclipse启动时立即终止
- C++执行bash脚本,该脚本终止并重新启动当前进程
- Eclipse CDT——是否有一种方法可以在启动新启动之前终止之前正在运行的启动?
- c++在linux下启动新进程并终止当前进程
- c++启动新进程并终止现有进程
- 如何使用QProcess在控制台窗口中启动和终止cmd.exe