使用进程名称终止进程
terminating a process using process name
我一直在尝试创建一个程序,该程序将使用进程名称终止进程。搜索后,API CreateToolhelp32Snapshot,Process32First,OpenProcess和TerminateProcess将帮助我完成此程序。
但是在编译时,我收到一个错误"错误 C2664:'strcmp':无法将参数 1 从'WCHAR [260]'转换为'常量字符 *'"关于这部分 "if (strcmp(pEntry.szExeFile, filename) == 0)"
关于如何解决此错误的任何建议?
谢谢!
#include "stdafx.h"
#include <windows.h>
#include <process.h>
#include <Tlhelp32.h>
#include <winbase.h>
#include <string.h>
void killProcessByName(const char *filename)
{
HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);
PROCESSENTRY32 pEntry;
pEntry.dwSize = sizeof (pEntry);
BOOL hRes = Process32First(hSnapShot, &pEntry);
while (hRes)
{
if (strcmp(pEntry.szExeFile, filename) == 0)
{
HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, 0,
(DWORD) pEntry.th32ProcessID);
if (hProcess != NULL)
{
TerminateProcess(hProcess, 9);
CloseHandle(hProcess);
}
}
hRes = Process32Next(hSnapShot, &pEntry);
}
CloseHandle(hSnapShot);
}
int main()
{
killProcessByName("calc.exe");
return 0;
}
您正在编译启用了 Unicode 的项目,因此您调用的基于 TCHAR
的 API 函数将映射到它们的 Unicode 版本(Process32First()
-> Process32FirstW()
、 Process32Next()
-> Process32NextW()
),因此pEntry.szExeFile
将是一个wchar_t[]
而不是char[]
。 但是strcmp()
只接受char*
字符串作为输入。这就是编译器所抱怨的,您在预期char*
的地方传递了一个wchar_t[]
。
要解决此问题,您必须:
-
直接调用 API 函数的 ANSI 版本,以匹配 ANSI
filename
参数。void killProcessByName(const char *filename) { HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL); if (!hSnapShot) return; PROCESSENTRY32A pEntry; pEntry.dwSize = sizeof (pEntry); BOOL hRes = Process32FirstA(hSnapShot, &pEntry); while (hRes) { if (strcmp(pEntry.szExeFile, filename) == 0) { HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, 0, pEntry.th32ProcessID); if (hProcess) { TerminateProcess(hProcess, 9); CloseHandle(hProcess); } } hRes = Process32NextA(hSnapShot, &pEntry); } CloseHandle(hSnapShot); } int main() { killProcessByName("calc.exe"); return 0; }
-
将
filename
参数更改为wchar_t*
以匹配 Unicode 函数,并使用wcscmp()
而不是strcmp()
。void killProcessByName(const wchar_t *filename) { HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL); if (!hSnapShot) return; PROCESSENTRY32W pEntry; pEntry.dwSize = sizeof (pEntry); BOOL hRes = Process32FirstW(hSnapShot, &pEntry); while (hRes) { if (wcscmp(pEntry.szExeFile, filename) == 0) { HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, 0, pEntry.th32ProcessID); if (hProcess) { TerminateProcess(hProcess, 9); CloseHandle(hProcess); } } hRes = Process32NextW(hSnapShot, &pEntry); } CloseHandle(hSnapShot); } int main() { killProcessByName(L"calc.exe"); return 0; }
相关文章:
- 运行代码时,c++ 会终止进程
- CLion 如何终止进程运行?
- 使用进程 ID 终止进程
- 有没有办法通过过滤进程的名称来自动终止进程?
- Windows资源监视器使用哪些Win32函数来检测已终止进程的磁盘和网络活动
- 终止进程并关闭其所有打开的侦听端口
- 如何释放被终止进程锁定的端口
- 使用进程名称终止进程
- 如何检测终止进程事件、计算机关闭和计算机崩溃
- 我无法使用终止进程杀死子进程
- 使用终止进程终止"mstsc.exe"进程时出现错误代码(5)访问被拒绝
- 在跨平台C++启动和终止进程
- 使用SIGSEGV或SIGABRT信号转储核心并终止进程
- 如何使用管理权限调用终止进程
- QT中的运行和终止进程C++通过按下按钮
- 使用SIGHUP重新启动终止进程
- dbus-c++中的断言错误,终止进程
- 如果在堆上定义,QProcess 不会终止/终止进程
- WinAPI - windows关闭前的清理终止进程
- 从VS10应用程序中查找/终止进程(VC6应用程序)