Интерфейс приложения очень прост:

Через поле ввода программа получает имя исполняемого файла (можно указать полное, сокращённое имя файла а так же опустить путь к файлу). По нажатию кнопки выполняется код поиска нужного процесса и его завершения. В программе я ориентируюсь на возможное применение UNICODE. Поэтому, задействованы макрос _TEXT() и тип TCHAR.
Код обработчика нажатия на кнопку:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TCHAR buff[MAX_PATH];
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(hSnapshot == INVALID_HANDLE_VALUE) //-1
{
Application->MessageBox(_TEXT("Can't create snapshot of existing processes."),
_TEXT("Error"), MB_ICONSTOP);
return;
}
PROCESSENTRY32 pe;
pe.dwSize = sizeof pe;
BOOL result = Process32First(hSnapshot, &pe);
while(result)
{
BOOL eq = lstrcmpi(pe.szExeFile, Edit1->Text.c_str());
if(eq)
{
GetFileTitle(pe.szExeFile, buff, MAX_PATH);
eq = lstrcmpi(buff, Edit1->Text.c_str());
}
if(eq)
{
GetShortPathName(pe.szExeFile, buff, MAX_PATH);
eq = lstrcmpi(buff, Edit1->Text.c_str());
}
if(!eq)
{
CloseHandle(hSnapshot);
HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pe.th32ProcessID);
if(hProcess == NULL)
{
Application->MessageBox(_TEXT("Can't open process for termination."),
_TEXT("Error"), MB_ICONSTOP);
return;
}
if(TerminateProcess(hProcess, 0))
{
WaitForSingleObject(hProcess, INFINITE);
CloseHandle(hProcess);
Application->MessageBox(_TEXT("Process succesfully terminated."),
_TEXT("Information"), MB_ICONINFORMATION);
}
return;
}
result = Process32Next(hSnapshot, &pe);
}
CloseHandle(hSnapshot);
Application->MessageBox(_TEXT("Can't find process specified."), _TEXT("Error"), MB_ICONSTOP);
}
|
Чтобы обеспечить условия, указанные в начале статьи (возможность указания полного, сокращённого и с опущенным путём имени файла), присутствует несколько операторов if, в которых производятся необходимые действия и, с помощью функции lstrcmpi (сравнение строк без учёта регистра), проверяется имя файла, из которого запущен текущий процесс в списке, на соответствие заданному.
Если соответствие найдено, производится попытка открыть процесс и завершить его. Для завершения процесса используется асинхронная функция TerminateProcess, поэтому мы дожидаемся завершения с помощью WaitForSingleObject.
Недостатки этого примера: