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

来源:百度知道 编辑:UC知道 时间:2024/05/31 23:24:43
我是菜鸟。

我想实现的功能是结束掉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=

看到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编程的回答。