非常奇怪,不知道为什么我终止不了进程,非系统进程,代码如下:void CEnumProcessDlg::Terminate(const CString& szTargetProcess)
{
PROCESSENTRY32 processEntry = {0};
HANDLE  hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(hProcessSnap == INVALID_HANDLE_VALUE)
return;
processEntry.dwSize = sizeof(PROCESSENTRY32);
BOOL bRet = Process32First(hProcessSnap,&processEntry);
int i = -1;
while(bRet)
{
HANDLE hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,processEntry.th32ProcessID);
CString str;
str.Format(_T("%s"),processEntry.szExeFile);
if(str.CompareNoCase(szTargetProcess) == 0)
{
DWORD dw;
GetExitCodeProcess(hModuleSnap,&dw);
TerminateProcess(hModuleSnap,dw);
CloseHandle(hProcessSnap);
return;
}
bRet = Process32Next(hProcessSnap,&processEntry); }
}这个是根据进程名去终止一个进程的.也调用了TerminateProcess函数,但不知道为什么返回结果是0,也就是说不成功,不知道为什么????请高手指点.

解决方案 »

  1.   

    既然是结束进程,不明白你为什么又在while中调用一次CreateToolhelp32Snapshot?
    在kill进程之前试着用AdjustTokenPrivileges调整权限至SE_DEBUG_NAME,然后kill it.
      

  2.   

    此处的 hModuleSnap 并不是进程的句柄而是快照的句柄,可以先OpenProcess获得句柄,在调用TerminateProcess
      

  3.   

    TOKEN_PRIVILEGES tp;
    HANDLE hToken;
    LUID luid; // 
    // enable debug privilege
    //  if(!OpenProcessToken(GetCurrentProcess(),
    TOKEN_ADJUST_PRIVILEGES,
    &hToken ))
    {
    return NULL;
    } if(!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid))
    {
    return NULL;
    } tp.PrivilegeCount           = 1;
    tp.Privileges[0].Luid       = luid;
    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES),
    NULL, NULL ); if (GetLastError() != ERROR_SUCCESS)
    {
    return NULL;
    }// 打开进程,然后kill it!
    HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, processEntry.th32ProcessID);
    TerminateProcess(hProcess, 0); // Revoke all privileges this process holds (including backup)
    AdjustTokenPrivileges( hToken, TRUE, NULL, 0, NULL, NULL); // close handle to process token
    CloseHandle(hToken);
      

  4.   

    问题解决了,一场误会,原以为CreateToolHelp32SnapShot返回的是当前进程的句柄,原来不是.还有一个问题就是,有办法可以终止大部分系统进程吗?是不是只要可以OpenProcess的进程就可以终止掉?如果用提升权限的方法打开了进程,是否可以用TerminateProcess将其终止?例如一些杀毒软件的进程,是没办法通过任务管理器关闭的.