Форум — Ответы     (  К темам )
 ?  Андрей: Завершение прцессов (03-02-2003 21:51:48)
Есть функция которая завершает приложения.
В 98винде она вроде бы завершает все приложения (но точно я в этом не уверен).
А вот в WinXP & Win2k она завершает только ползовательские процессы. Как завершить любой процесс во всех версиях винды (ну или хотя бы 98, XP, 2k)?

//---------------------------------------------------------------------------
// =================== завершаем процессы =================== //
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HANDLE ss;
PROCESSENTRY32 pe;
bool fl;

pe.dwSize=sizeof(pe);
ss=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
fl=Process32First(ss,&pe);

AnsiString s;
s=Edit2->Text;

char text[260];
strcpy(text,s.c_str());

while (fl)
{
fl=Process32Next(ss,&pe);
if ((strstr(text,pe.szExeFile) && strlen(text)>0 && strlen(pe.szExeFile)>0))
{
HANDLE h=OpenProcess(PROCESS_ALL_ACCESS,true,pe.th32ProcessID);
TerminateProcess(h,0);
};
};

CloseHandle(ss);
}
//---------------------------------------------------------------------------
 Devnvd (04-02-2003 09:18:14)
Любой процесс не получится.
Завершить нормально программу можно так:
PostMessage(hWnd,WM_SYSCOMMAND,SC_CLOSE,0);
где hWnd — главное Окно программы.

Для завершения с помощью TerminateProcess необходимо получить Handle процесса.
При этом вы должны иметь право доступа PROCESS_TERMINATE к процессу.
Когда вы получаете Handle:
HANDLE h=OpenProcess(PROCESS_ALL_ACCESS,true,pe.th32ProcessID);
то вас могут просто проигнорировать.

Аналогично и при другом виде этого же способа:

unsigned long* pPid; //LPDWORD
void *hg; //HGLOBAL
unsigned long id;

hg = GlobalAlloc(GMEM_SHARE,sizeof(unsigned long));
pPid = (unsigned long *)GlobalLock(hg);

GetWindowThreadProcessId(hWnd,pPid);
id=*pPid;
HANDLE ps = OpenProcess(1,false,id);
if (ps)
{
TerminateProcess(ps,-9);
MessageBox(0,"User, Go home!!!","Administrator",
MB_OK|MB_SERVICE_NOTIFICATION|MB_ICONSTOP|MB_TOPMOST);
}
if(ps)CloseHandle(ps); //На всякий случай, если убить не удалось
GlobalUnlock(pPid); //Освобождаем
GlobalFree(hg); //Освобождаем

Вам необходимо получить права администратора или быть в этот момент в процессе запущенном с правами администратора, например в сервисе.

После использования TerminateProcess лучше перегружаться. А следовательно для всех систем подойдёт кнопка Reset.