c语言 api编程的一个问题。

我是菜鸟。

我想实现的功能是结束掉QQ.exe这个进程。

我的具体想法是 用enumprocesses 获得进程的PID,然后利用openprocess

获得进程的句柄,再利用EnumProcessModules获得进程模块的句柄

最后利用GetModuleBaseName 就可以获得模块的名称了。我预先定义好了

char to_be_terminated[]="QQ.exe"; 利用strcmp 函数 把模块的名称和QQ.exe比较

如果相同 则结束该模块所在的进程。 这样就把QQ.exe这个进程给结束了。

我用的是 cfree 编译器是MinGW

下面是代码

#include <windows.h>
#include <Psapi.h>
#include <string.h>
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

PSTR szCmdLine, int iCmdShow)
{
DWORD processes_array[1024],processes_sumbytes;
int i,j,m;
HMODULE hmodule_array[1024];
LPDWORD sum_module_bytes;
LPTSTR base_name_buffer;
char to_be_terminated[]="QQ.exe";
EnumProcesses(processes_array,sizeof(processes_array),&processes_sumbytes);
for(i=0;i<processes_sumbytes/sizeof(processes_array);i++)
{
HANDLE processes_handle=OpenProcess(PROCESS_ALL_ACCESS,FALSE,processes_array[i]);
EnumProcessModules(processes_handle,hmodule_array,sizeof(hmodule_array),sum_module_bytes);
for(j=0;j<*(sum_module_bytes)/sizeof(HMODULE);j++)
{
GetModuleBaseName(processes_handle,hmodule_array[j],base_name_buffer,1024);
m=strcmp(to_be_terminated,base_name_buffer);
if(m=0)
TerminateProcess(processes_handle,0);
}
}
return 0 ;
}

编译后 没有错误 没有警告,不知道程序哪里出了问题了。

请大家就这个程序指点一二,谢谢!

很多地方有错误,最明显的几处:
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\n",
pa[i]);
continue;
}
if(!EnumProcessModules(hProcess,
&hModule,
sizeof(hModule),
&cbNeeded2))
{
printf("enum
process
modules
failed
PID:%d\n",
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;
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-08-23
看到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编程的回答。本回答被提问者采纳
相似回答
大家正在搜