#include<iostream>
#include<windows.h>
#include<TLHelp32.h>
using namespace std;
bool KillProcessor(LPCTSTR ProcessName)
{
bool KillSuccess=false; 
PROCESSENTRY32 PE32;
PE32.dwSize=sizeof(PE32);
HANDLE hProcSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if (hProcSnap!=NULL)
{
bool HasTheProc=Process32First(hProcSnap,&PE32);
if (HasTheProc)
{
while (HasTheProc)
{   
if ((LPCTSTR)PE32.szExeFile==ProcessName)
{
HANDLE hProcessor=OpenProcess(PROCESS_ALL_ACCESS,false,PE32.th32ProcessID);
KillSuccess=TerminateProcess(hProcessor,0);
CloseHandle(hProcessor);
cout<<"adlkajsldjlkajslkfjlkasjkdljasd"<<endl;
}
HasTheProc=Process32Next(hProcSnap,&PE32);
}
CloseHandle(hProcSnap);
}
}
CloseHandle(hProcSnap);
return KillSuccess;
}int main ()
{
    cout<<KillProcessor("notepad.exe")<<endl;
}
**********************************************************************没法结束进程if ((LPCTSTR)PE32.szExeFile==ProcessName)
{
HANDLE hProcessor=OpenProcess(PROCESS_ALL_ACCESS,false,PE32.th32ProcessID);
KillSuccess=TerminateProcess(hProcessor,0);
CloseHandle(hProcessor);
cout<<"adlkajsldjlkajslkfjlkasjkdljasd"<<endl;
}
if 里面的东西不执行...即 PE32.szExeFile==ProcessName 不成立,
求解.......

解决方案 »

  1.   

    (LPCTSTR)PE32.szExeFile==ProcessName
    两个指针比较?这个无语。
    还是用这个吧:
    if (lstrcmpi(PE32.szExeFile, ProcessName) == 0)
    {
    ......
    }
      

  2.   

    PE32.szExeFile==ProcessName 
    怎么能比较两个指针的地址呢,这个肯定是不相等的啊,
    用lstrcmp来比较字符串
      

  3.   

    楼主,你所说的无法结束进程,是因为楼主循环里的判断条件不应该是HasTheProc。楼主应该检查ERROR_NO_MORE_FILES这个作为判断条件
      

  4.   

    又发了一帖?
    除了上面说的问题外,还有一个大小写的问题,最好用CharLower将PE32.szExeFile转成小写,然后比较
      

  5.   

    DWORD code;
    GetExitCodeProcess(hProcessor, &code);
    if (STILL_ACTIVE == code)
    {
    ......
    }
    else
    {
    ......
    }
      

  6.   

    windows核心编程中说了 用主函数来结束进程 可以比较柔和的结束你的进程,否则有些系统对象释放不干净
    //终止线程测试
    //通过进程的主线程函数返回的退出测试
    #include <windows.h>
    #include <iostream>
    class obj
    {
    public:
    obj() {printf("Constructot\n");Sleep(1000); }
    ~obj() {printf("Destuctor\n");Sleep(1000); }
    };
    int gi = 1;
    DWORD WINAPI Fun1Proc(LPVOID lpParameter )
    {
    while(gi)
    {
    printf("1\n");
    Sleep(500);
    }
    return 0;
    }
    DWORD WINAPI Fun2Proc(LPVOID lpParameter )
    {
    while(gi)
    {
    printf("2\n");
    Sleep(500);
    }

    return 0;
    }
    int threadtest()
    {
    obj obj1;
    HANDLE hThread1;
    HANDLE hThread2;
    hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
    hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
    CloseHandle(hThread1);
    CloseHandle(hThread2);

    Sleep(3000);
    gi = 0;//3秒终止该进程
    //ExitProcess(1);和exit(1); 无法彻底析构对象
    return 0;
    }
      

  7.   

    if ((LPCTSTR)PE32.szExeFile==ProcessName)这个首先不对.
    其次结束不了进程是因为XP SP2之后需要Debug权限.提权吧.代码一大堆
      

  8.   

    BOOL EnablePrivilege(TCHAR* PrivilegeName) //ÌáȨ
    {
    HANDLE tokenhandle;
    TOKEN_PRIVILEGES tp;
    tp.PrivilegeCount=1;
    tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
    if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&tokenhandle))
    {
    MessageBox(_T("OpenProcessToken Failed"),_T("ERROR"));
    return FALSE;
    }
    if (!LookupPrivilegeValue(NULL,PrivilegeName,&tp.Privileges[0].Luid))
    {
    MessageBox(_T("LookupPrivilegeValue Failed"),_T("ERROR"));
    CloseHandle(tokenhandle);
    return FALSE;
    }
    if (!AdjustTokenPrivileges(tokenhandle,FALSE,&tp,sizeof(tp),NULL,NULL))
    {
    MessageBox(_T("LookupPrivilegeValue Failed")_T("ERROR"));
    CloseHandle(tokenhandle);
    return FALSE;
    }
    CloseHandle(tokenhandle);
    return TRUE;
    }