如何通过WinAPI关闭由cmd.exe启动的dumpcap.exe进程?
问题描述
- 在cmd.exe中使用dumpcap抓包的命令:
dumpcap.exe -i 5 -w:\Users\xyz.abc\Desktop\allPacketTMC.pcapng - QT GUI中点击「Start LOG」按钮启动抓包的当前实现代码:
const char *command = "dumpcap.exe -i 5 -w:\Users\xyz.abc\Desktop\allPacketTMC.pcapng"; std::system(command);
- 遇到的问题:
- 仅能通过cmd窗口按下
Ctrl-C关闭dumpcap,无法从GUI直接操作 - 用
EnumProcessModules()遍历进程时,找不到dumpcap.exe的PID - 尝试用QT的
QProcess创建进程,无法在打开的窗口中运行 - 尝试用Win32 API的
CreateProcess()启动,但不会设置lpCommandLine参数,未能成功启动dumpcap
- 仅能通过cmd窗口按下
解决方案
方案1:改用QT的QProcess(推荐)
直接用QProcess启动dumpcap,跳过cmd中转,可直接控制进程生命周期:
// 类成员变量声明:QProcess *dumpcapProcess; dumpcapProcess = new QProcess(this); // 拆分命令与参数,注意路径转义 QStringList args; args << "-i" << "5" << "-w" << "C:\\Users\\xyz.abc\\Desktop\\allPacketTMC.pcapng"; // 若需要显示cmd窗口,添加以下配置 dumpcapProcess->setCreateProcessArgumentsModifier([](QProcess::CreateProcessArguments *args) { args->flags |= CREATE_NEW_CONSOLE; }); dumpcapProcess->start("dumpcap.exe", args); // 停止抓包按钮的槽函数 void on_StopLogBtn_clicked() { if (dumpcapProcess && dumpcapProcess->state() == QProcess::Running) { // 先尝试优雅终止,超时则强制杀死 dumpcapProcess->terminate(); if (!dumpcapProcess->waitForFinished(3000)) { dumpcapProcess->kill(); } } }
方案2:用Win32 API的CreateProcess直接启动dumpcap
直接启动dumpcap进程,保存进程句柄用于后续关闭:
#include <windows.h> // 全局或类成员变量保存进程信息 PROCESS_INFORMATION pi = {0}; STARTUPINFO si = {sizeof(si)}; si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_SHOW; // 显示cmd窗口 // 命令行参数需转义路径,第一个参数为程序名(可重复) wchar_t cmdLine[] = L"dumpcap.exe -i 5 -w:C:\\Users\\xyz.abc\\Desktop\\allPacketTMC.pcapng"; // 启动进程 if (CreateProcessW(NULL, cmdLine, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi)) { // 进程启动成功,保存pi.hProcess和pi.dwProcessId } // 关闭dumpcap的函数 void stopDumpcap() { if (pi.hProcess) { // 先发送Ctrl-C信号尝试优雅终止 GenerateConsoleCtrlEvent(CTRL_C_EVENT, pi.dwProcessId); if (WaitForSingleObject(pi.hProcess, 3000) == WAIT_TIMEOUT) { // 超时则强制终止 TerminateProcess(pi.hProcess, 0); } CloseHandle(pi.hProcess); CloseHandle(pi.hThread); ZeroMemory(&pi, sizeof(pi)); } }
方案3:修复std::system启动后的进程查找问题
用std::system启动时,dumpcap是cmd.exe的子进程,需遍历进程树查找:
- 先找到启动dumpcap的cmd.exe进程PID(可通过
CreateProcess启动cmd时保存,或通过窗口标题定位) - 枚举该PID的所有子进程,找到dumpcap.exe的PID
- 调用
OpenProcess获取进程句柄,再用TerminateProcess关闭
内容的提问来源于stack exchange,提问作者crazyChicken
相关产品推荐
相关产品推荐

