imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 25.04.2005, 23:13     # 1
wolandino
Guest
 
Сообщения: n/a

закрытие процесса

Приветствую,

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

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

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

В общем, замучился, я с ними уже... В чем моя ошибка при удалении процессов?
 
Старый 26.04.2005, 13:39     # 2
alexey_ma
Member
 
Регистрация: 10.03.2002
Адрес: Israel
Сообщения: 245

alexey_ma Нимб уже пробиваетсяalexey_ma Нимб уже пробивается
Цитата:
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]);
__________________
Best Regards
alexey_ma вне форума  
Старый 26.04.2005, 14:49     # 3
wolandino
Guest
 
Сообщения: n/a

пробовал так делать... рез-т такой же
 
Старый 26.04.2005, 15:22     # 4
dyr_farot
Advanced Member
 
Регистрация: 23.08.2003
Сообщения: 442

dyr_farot Нимб уже пробиваетсяdyr_farot Нимб уже пробивается
во-первых немешалобы коды ошибок посмотреть.
а во-вторых для закрытия процесса его нужно открыть с правами PROCESS_TERMINATE.
т.е. OpenProcess(PROCESS_TERMINATE,NULL ,hand_ar[j]);
dyr_farot вне форума  
Старый 26.04.2005, 15:31     # 5
alexey_ma
Member
 
Регистрация: 10.03.2002
Адрес: Israel
Сообщения: 245

alexey_ma Нимб уже пробиваетсяalexey_ma Нимб уже пробивается
Точно. Я не обратил внимание на DesiredAccess параметр.
Конечно -же должно быть PROCESS_TERMINATE.
__________________
Best Regards
alexey_ma вне форума  
Старый 26.04.2005, 16:04     # 6
wolandino
Guest
 
Сообщения: n/a

млин... баловался я и с правами доступа, выставлял PROCESS_TERMINATE - все одно - не работает
 
Старый 26.04.2005, 16:10     # 7
dyr_farot
Advanced Member
 
Регистрация: 23.08.2003
Сообщения: 442

dyr_farot Нимб уже пробиваетсяdyr_farot Нимб уже пробивается
тогда мпрошу еще раз: не работает КАК?
т.е. что TerminateProcess() возвращает?
какой пид в OpenProcess() передаеш? ( т.е. совпадает ли он с пидом из диспетчера задач? )
dyr_farot вне форума  
Старый 26.04.2005, 16:47     # 8
wolandino
Guest
 
Сообщения: n/a

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

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

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

Из-за чего такое может происходить? То как, я заполняю массив с идентификаторами и получаю список процессов в моем первом посте.
 
Старый 26.04.2005, 17:01     # 9
dyr_farot
Advanced Member
 
Регистрация: 23.08.2003
Сообщения: 442

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


Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


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




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