IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Программирование (http://www.imho.ws/forumdisplay.php?f=40)
-   -   закрытие процесса (http://www.imho.ws/showthread.php?t=84506)

wolandino 26.04.2005 00:13

закрытие процесса
 
Приветствую,

Ребята, очень нужна ваша помощь, запарился совсем... Пытаюсь написать небольшую программку, типа Диспетчера задач... Никак у меня не получается закрывать процессы....

Позволю себе привести некоторые части кода:

DWORD process_ids[5000];
DWORD num_processes;
int success;

if (
NULL == VDMEnumTaskWOWEx ||
NULL == EnumProcesses ||
NULL == GetModuleFileName ||
NULL == GetModuleBaseName ||
NULL == EnumProcessModules
)
return;

num_processes=0;
success = EnumProcesses(process_ids, sizeof(process_ids), &num_processes);
num_processes/=sizeof(process_ids[0]);

if (!success) {return;}

for (unsigned i=0; i<num_processes; i++)
{
HANDLE process = OpenProcess(PROCESS_QUERY_INFORMATION |
PROCESS_VM_READ, FALSE, process_ids[i]);
HMODULE modules[500];
DWORD num_modules;
char file_name [MAX_PATH];
EnumProcessModules(process, modules, sizeof(modules), &num_modules);
num_modules /= sizeof (modules[0]);
if (GetModuleFileName(process, modules[0], file_name, sizeof(file_name)))
{
CString mstr;
char string1[256];
wsprintf (string1, " %#4x \t%-55s",process_ids[i], file_name);
mstr=string1;
m_ListPS.AddString(mstr);
GetModuleBaseName(process, modules[0], file_name, sizeof(file_name));
}


CloseHandle(process);

hand_ar[i]=process_ids[i];

}

return;
}



Это я получаю инфу о процессах, и вывожу их в clistbox


int j=m_ListPS.GetCurSel();
char str[256];
wsprintf (str,"%#4x \t%",hand_ar[j]);
HANDLE CurProc=OpenProcess(PROCESS_QUERY_INFORMATION,NULL,(unsigned)str);
BOOL ec=GetExitCodeProcess(CurProc,(unsigned long*)STILL_ACTIVE);
TerminateProcess(CurProc,ec);
CloseHandle(CurProc);




Самое интересное в том, что тут wsprintf (str,"%#4x \t%",hand_ar[j]); у меня то правильные идентификаторы передаются, но "неправильные" Smile

В общем, замучился, я с ними уже... В чем моя ошибка при удалении процессов?

alexey_ma 26.04.2005 14:39

Цитата:

wolandino:
nt j=m_ListPS.GetCurSel();
char str[256];
wsprintf (str,"%#4x \t%",hand_ar[j]);
HANDLE CurProc=OpenProcess(PROCESS_QUERY_INFORMATION,NULL ,(unsigned)str);
Я что-то не понимаю зачем ты PID заворачиваешь в стринг а потом кастируешь этот-же стринг на (unsigned). Ты же в массиве hand_ar хранишь уже готовые к употреблению PID-ы. По моему достаточно сделать просто :
HANDLE CurProc=OpenProcess(PROCESS_QUERY_INFORMATION,NULL ,hand_ar[j]);

wolandino 26.04.2005 15:49

пробовал так делать... рез-т такой же

dyr_farot 26.04.2005 16:22

во-первых немешалобы коды ошибок посмотреть.
а во-вторых для закрытия процесса его нужно открыть с правами PROCESS_TERMINATE.
т.е. OpenProcess(PROCESS_TERMINATE,NULL ,hand_ar[j]);

alexey_ma 26.04.2005 16:31

Точно. Я не обратил внимание на DesiredAccess параметр.
Конечно -же должно быть PROCESS_TERMINATE.

wolandino 26.04.2005 17:04

млин... баловался я и с правами доступа, выставлял PROCESS_TERMINATE - все одно - не работает

dyr_farot 26.04.2005 17:10

тогда мпрошу еще раз: не работает КАК?
т.е. что TerminateProcess() возвращает?
какой пид в OpenProcess() передаеш? ( т.е. совпадает ли он с пидом из диспетчера задач? )

wolandino 26.04.2005 17:47

Цитата:

тогда мпрошу еще раз: не работает КАК?
не закрывает процессы вообще, или не закрывает нужные, думал дело в индексах массива hand_ar - проверил, вроде правильно все передается

[quote]т.е. что TerminateProcess() возвращает?[/qoute]
возващает 0

Цитата:

какой пид в OpenProcess() передаеш? ( т.е. совпадает ли он с пидом из диспетчера задач? )
Передаю id=process_ids[i], см. мой первый пост... Сравнил pid в диспетчере задач и свои... и обнаружил интересную вещь - в массив заносятся почему-то не все значения идентификаторов процессов... В частности, были проигнорированы avpm.exe и explorer.exe ... Из-за этого и траблы при удалении процессов...

Из-за чего такое может происходить? То как, я заполняю массив с идентификаторами и получаю список процессов в моем первом посте. :молись:

dyr_farot 26.04.2005 18:01

странно. в ремарках к EnumProcesses() ничего на этот счет не обнаружил... а что она возвращает?


Часовой пояс GMT +4, время: 00:03.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.