- wpBeta
-
很多地方有错误,最明显的几处:
1、EnumProcesses(processes_array,sizeof(processes_array),&processes_sumbytes);
sizeof(processes_array)是整个数组的总字节数,这里传入的应该是元素个数
2、for(i=0;i<processes_sumbytes/sizeof(processes_array);i++)
同上,应该是processes_sumbytes/sizeof(processes_array[0])
3、EnumProcessModules(processes_handle,hmodule_array,sizeof(hmodule_array),sum_module_bytes);
sum_module_bytes没赋值
4、m=strcmp(to_be_terminated,base_name_buffer);
strcmp无法忽略大小写进行名称比较
5、if(m=0)
。。。
贴上我的实现代码,已经测试可行:
#include
<windows.h>
#include
<psapi.h>
#include
<stdio.h>
#define
N
1024
int
WINAPI
WinMain
(HINSTANCE
hInstance,
HINSTANCE
hPrevInstance,
PSTR
szCmdLine,
int
iCmdShow)
{
DWORD
pa[N],
cbNeeded,
i,
cbNeeded2;
HANDLE
hProcess;
HMODULE
hModule;
char
buffer[512];
char*
target
=
"qq.exe";
BOOL
flag
=
FALSE;
if(!EnumProcesses(pa,
N,
&cbNeeded))
{
puts("error
while
enumerating
processes.");
return
0;
}
for(i
=
0;
i
<
cbNeeded/sizeof(pa[0]);
++i)
{
if(!(hProcess
=
OpenProcess(PROCESS_ALL_ACCESS,
FALSE,
pa[i])))
{
printf("open
process
PID:%d
failed ",
pa[i]);
continue;
}
if(!EnumProcessModules(hProcess,
&hModule,
sizeof(hModule),
&cbNeeded2))
{
printf("enum
process
modules
failed
PID:%d ",
pa[i]);
continue;
}
GetModuleBaseName(hProcess,
hModule,
buffer,
sizeof(buffer));
if(lstrcmpi(target,
buffer)
==
0)
{
TerminateProcess(hProcess,
0);
flag
=
TRUE;
break;
}
}
if(flag)
printf("target
process:
%s
successfully
terminated.",
target);
else
puts("terminate
process
failed.");
return
0;
}
- 北有云溪
-
看到for里的i<processes_sumbytes/sizeof(processes_array);感到奇怪,processes_sumbytes/sizeof(processes_array);不就是processes_sumbytes/4096,你明白吗?
----------------------------------------------------
还有EnumProcessModules(processes_handle,hmodule_array,sizeof(hmodule_array),sum_module_bytes);
中sum_module_bytes未初始化
同样的,GetModuleBaseName(processes_handle,hmodule_array[j],base_name_buffer,1024);
中base_name_buffer未初始化。
你至少应该这样LPSTR base_name_buffer = malloc(...);
或者 CHAR base_name_buffer[SIZE];
-----------------------------------------------------
最后提几点建议:
1)m=strcmp(to_be_terminated,base_name_buffer);
to_be_terminated 是char[]型,而base_name_buffer是LPTSTR型,假设定义了UNICODE宏,类型将不匹配,编译将失败。所以要么全用TCHAR,LPTSTR,函数用_tcscmp,要么全用char,LPSTR,函数用strcmp。
2)要调用CloseHandle关闭句柄,养成良好习惯。
3)请多看我的百度知道关于C++与Windows编程的回答。