我一直在尝试创建一个程序,该程序将使用进程名称终止进程。 搜索后,API CreateToolhelp32Snapshot,Process32First,OpenProcess和TerminateProcess会帮助我完成此程序。
但是在编译时,出现错误“错误C2664:'strcmp':无法将参数1从'WCHAR [260]'转换为'const char *'” 在这一部分上,“ 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;
}
答案 0 :(得分:0)
您正在编译启用Unicode的项目,因此您正在调用的基于TCHAR
的API函数将映射到其Unicode版本(Process32First()
-> Process32FirstW()
,{{1} }-> Process32Next()
),因此Process32NextW()
将是pEntry.szExeFile
而不是wchar_t[]
。但是char[]
仅接受strcmp()
个字符串作为输入。这就是编译器所抱怨的,您传递了char*
所在的wchar_t[]
。
要解决此问题,您将必须:
直接调用API函数的ANSI版本,以匹配您的ANSI char*
参数。
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
以匹配Unicode函数,并使用wchar_t*
代替wcscmp()
。
strcmp()