C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Как убить процесс, зная его имя ?, Например, EXCEL.EXE !!!
Aptem
Отправлено: 28.06.2004, 15:08


Мастер участка

Группа: Участник
Сообщений: 349



Привет, всем!

Думаю вопрос понятен !!! Как убить процесс, зная его имя ??? Например, в WinXP в диспетчере задач есть процесс EXCEL.EXE, так как же его убить ?

Спасибо за внимание. Прошу не посылать меня на... поиск по форуму, просто времени совсем нет искать.
Father
  Отправлено: 29.06.2004, 07:54


Ученик-кочегар

Группа: Участник
Сообщений: 17



Ну вобщем тебе надо раздобыть дескриптор убиваемого процесса, чтобы потом вызвать TerminateProcess(hProcess,0). Это можно сделать несколькими способами, например так, как показано ниже:
(Только перед компиляцией этого надо к проекту подключить "C:\Program Files\Borland\CBuilder6\Lib\Psdk\psapi.lib")
CODE
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <psapi.h>
//------------------------------------------------------------------------------
void __fastcall TForm1::TerminateProcessByName(AnsiString aProcess)
{       DWORD aProcesses[1024], cbNeeded, cProcesses;
       if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) ) return;
       cProcesses = cbNeeded / sizeof(DWORD);
       for (UINT i = 0; i < cProcesses; i++ )
       {       TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>");
               HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
                                              PROCESS_VM_READ |
                                              PROCESS_TERMINATE,
                                              FALSE, aProcesses[i] );
               if (hProcess != NULL)
               {       HMODULE hMod;
                       DWORD cbNeeded;
                       if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod),
                                                &cbNeeded) )
                       {       GetModuleBaseName( hProcess, hMod, szProcessName,
                                                  sizeof(szProcessName)/sizeof(TCHAR) );
                               if (aProcess == szProcessName)
                                       if (!TerminateProcess(hProcess,0))
                                               MessageBox(Handle, "Cannot terminate process!", "Error!", MB_OK + MB_ICONERROR);
                       };
               };
               CloseHandle( hProcess );
       };
};
//------------------------------------------------------------------------------
Aptem
Отправлено: 30.06.2004, 08:47


Мастер участка

Группа: Участник
Сообщений: 349



Все работает как надо ! ОГРОМНОЕ спасибо ! КЛАСС !
Dushman
Отправлено: 02.07.2004, 09:45


Ученик-кочегар

Группа: Участник
Сообщений: 8



объясните plz чайнику, как заставить это работать sad.gif
Gedeon
Отправлено: 02.07.2004, 11:10


Ветеран

Группа: Модератор
Сообщений: 1742



Ctrl+C, Ctrl+V
и
Только перед компиляцией этого надо к проекту подключить "C:\Program Files\Borland\CBuilder6\Lib\Psdk\psapi.lib"
Т.е. Project->AddToProject ...
Dushman
Отправлено: 02.07.2004, 11:53


Ученик-кочегар

Группа: Участник
Сообщений: 8



и вставить выделенное в FormCreate ??
Aptem
Отправлено: 04.07.2004, 07:50


Мастер участка

Группа: Участник
Сообщений: 349



Суть в том, что есть процесс, который нужно убить. Эту функцию ты вставляешь туда, где необходимо это действие, либо в FormCreate, либо в Button OnClick зашиваешь, это не важно !! Самое главное — подключить библиотеку, я это делаю немного по-другому, программно:
CODE

#pragma comment ( lib, "lib\psapi.lib" )
#include <psapi.h>


Эти директивы пишешь в заголовочном файле, то есть в *.h, хотя можно в любом месте, но нужно соблюдать правила оформления !!!

Затем передаешь имя процесса в функцию и все, процесс исчезает из Менеджера задач ! Например, я убивал процесс EXCEL.EXE !!!
Guest
Отправлено: 05.07.2004, 12:26


Не зарегистрирован







Спасибо smile.gif

Вернуться в Вопросы программирования в C++Builder