| Форум| Гостевая| Ссылки| Программы| Исходные тексты| Наши партнеры.|
   
| Главная| Рассылки| Услуги| Библиотека| Новости| Авторам| Программистам| Студентам|
delphi c++ assembler
 

Шаг 33 - Win98 как NT. Убиваем процесс.

Итак, мы с Вами получили список процессов. Теперь на диалоговую панель добавим новую кнопку Terminate Process. Если в списке выделен процесс, то по нажатию на эту кнопку процесс будет удален. Вот код.
void CScanProcessDlg::OnTernimate() 
{
int inIndex;
inIndex=m_List1.GetCurSel();
if (inIndex!=LB_ERR)
{
	CString csExName;
	m_List1.GetText(inIndex,csExName); 
	HANDLE hSnap;
 	hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	if (hSnap == NULL) 
	{
		AfxMessageBox("Error Load ToolHelp");
	}
	else
	{
	PROCESSENTRY32 proc;
	if (Process32First(hSnap, &proc))
	{
		if (csExName==proc.szExeFile) TerminateProcess(hSnap,0); 
		while (Process32Next(hSnap, &proc)) 
		{
			
		if (csExName==proc.szExeFile)
		{
			HANDLE ProcessHandle=NULL;
			ProcessHandle = OpenProcess(SYNCHRONIZE, TRUE, proc.th32ProcessID);
			if (ProcessHandle!=NULL)
			{
			TerminateProcess(ProcessHandle,0);
			CloseHandle(ProcessHandle);
			Sleep(5000);
			OnScan(); 
			}
			else AfxMessageBox("Not Open Process");
		}
		}
		CloseHandle(hSnap);
	}
	}
}
else AfxMessageBox("Select Process");
}
Сначала проверяем выбран ли элемент списка if (inIndex!=LB_ERR). Если выбран пробегаем по процессам. Код повторяется как при сканировании процесса. Конечно можно было создать массив при сканировании. Но процесс дело тонкое, то он есть, а то его нет. Лучше на мой взгляд просканировать еще раз. Если его находим, то открываем с помощью функции OpenProcess(). Дальше спокойно вызываем TerminateProcess.
HANDLE OpenProcess
(
  DWORD dwDesiredAccess,  // флаг доступа
  BOOL bInheritHandle,    // флаг наследования
  DWORD dwProcessId       // идентификатор процесса
);
Идентификатор процесса мы берем из структуры PROCESSENTRY32 - это переменная, которая заполняется при запуске.
BOOL TerminateProcess(
  HANDLE hProcess, // Указатель процесса
  UINT uExitCode   // Код возврата процесса
);
Задержку я сделал для того, чтобы обновить список через некоторое время, так как удаление процесса не моментальное дело. Программу я испытывал на Windows 98. Удаляет все процессы кроме Kernel :) Оно и понятно, сам себя удалять не будешь. При этом помните шаг "Шаг 31 - Программа, которая не удаляется из списка задач". Отсюда удалить ее можно и это получается. Кроме того удалить можно и процесс оболочки. Все работает как в NT. Отсюда рождается много интересных вещей. Например, можно выяснить почему тормозит Windows. Многие процессы просто не нужны для работы. Попробуйте поудаляйте.
Предыдущий Шаг | Следующий Шаг | Оглавление

By Artem.
Используются технологии uCoz
 

Rambler's Top100 Rambler's Top100

©  Adept Design Studio

Используются технологии uCoz