Форум — Ответы ( К темам )
? | Андрей: Завершение прцессов (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. |