Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.58/83: Рейтинг темы: голосов - 83, средняя оценка - 4.58
bodrich
102 / 92 / 14
Регистрация: 20.06.2010
Сообщений: 963
Записей в блоге: 16
Завершенные тесты: 1
1

Завершить процесс

03.02.2011, 18:14. Просмотров 17164. Ответов 21
Метки нет (Все метки)

Как завершить процессор(которые обычно отображаются в диспетчере задач) например надо завершить процессор game.exe.
П.С. Есть какой-нибудь русскоязычный FAQ по билдеру?
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.02.2011, 18:14
Ответы с готовыми решениями:

Как завершить процесс зная его имя?
Хочу убить процесс зная его имя, но, он не убивается. (( Как это можно сделать? Пишу на...

как завершить процесс запущенный от себя по имени процесса?
как завершить процесс запущенный от себя по имени процесса? что то искал везде но не нашёл ...

Открыть процесс процесс на полный доступ, и запретить для других
Всем доброго времени суток. Друзья, HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE,...

Завершить программу
Вот это уже есть, помогите доделать А) При введении недопустимого символа в поля ввода значений,...

Завершить .bat
Уважаемые форумчане подскажите как завершить работу батников, у них же нету имени процесса

21
Vlad_IT
1446 / 355 / 60
Регистрация: 03.04.2010
Сообщений: 2,095
03.02.2011, 19:53 2
Можно из программы создать временный Bat. Текстовый файл со следуйщим содержаним.
Код
taskkill /IM game.exe
и запустить его из программы на выполнение обычной командой ShellExecute. А потом удалить файл командой DeleteFile. Вроде способ хороший.
0
ISergey
Maniac
Эксперт С++
1435 / 939 / 156
Регистрация: 02.01.2009
Сообщений: 2,801
Записей в блоге: 1
03.02.2011, 19:57 3
http://msdn.microsoft.com/en-us/library/ms686714(v=vs.85).aspx

PS. за частую нужно иметь привилегии отладчика..
3
kzru_hunter
1113 / 782 / 100
Регистрация: 01.02.2011
Сообщений: 1,795
Записей в блоге: 1
03.02.2011, 20:32 4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <tlhelp32.h>
...
DWORD GetProcessByExeName(char *ExeName);
...
// ------------------------------------- Использование --------------------------------------
        DWORD PID = GetProcessByExeName("notepad.exe");
        if ( !PID ) ShowMessage("Процесс не найден");
        else
        {
        HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, PID );
        if ( TerminateProcess(hProcess, 0) ) ShowMessage("Процесс убит");
                else ShowMessage("Не могу убить процесс");
        }
// ----------------------------------------------------------------------------------
 
DWORD GetProcessByExeName(char *ExeName)
{
        DWORD Pid;
 
    PROCESSENTRY32 pe32;
        pe32.dwSize = sizeof(PROCESSENTRY32);
 
    HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);
    if( hProcessSnap == INVALID_HANDLE_VALUE)
    {
        MessageBox(NULL, "Error = " + GetLastError() , "Error (GetProcessByExeName)", MB_OK|MB_ICONERROR);
        return false;
    }
 
    if ( Process32First(hProcessSnap, &pe32) )
        {
            do
                {
                    if ( strcmpi(pe32.szExeFile, ExeName) == 0)
                        {
                                CloseHandle(hProcessSnap);
                                return pe32.th32ProcessID;
                        }
                } while ( Process32Next(hProcessSnap, &pe32) );
        }
 
    CloseHandle(hProcessSnap);
        return 0;
}
3
03.02.2011, 20:32
Vlad_IT
1446 / 355 / 60
Регистрация: 03.04.2010
Сообщений: 2,095
03.02.2011, 21:25 5
C++
1
2
3
4
5
6
7
8
TMemo* mem = new TMemo(this); // Создаем Memo. В этом случае лучще использовать Memo. Да и просто плохо разбираюсь с VCL
mem->Text = "taskkill /IM game.exe"; //Записываем с mem команду для командной строки. game.exe это процес
mem->Lines->SaveToFile("task.bat");  // Создаем так называемый батник. Он служит для перидачи команд в командную строку Windows
ShellExecute(Handle, "open", "task.bat", NULL, NULL, SW_RESTORE); //после чего запускаем созданный нами батник, что приводим к завершению процеса game.exe
Sleep(1000); //задержка обязательна, так как надо дать завершить процес прежде чем удалять батник.
DeleteFile("task.bat"); //Теперь прощаемся с батником. Удаляем его. :( Но это не обязательно. Только если вы не хотите что-бы узер решивший запустить батник не заверщил процес
 
//на этом все. Удачи Вам!
1
ISergey
Maniac
Эксперт С++
1435 / 939 / 156
Регистрация: 02.01.2009
Сообщений: 2,801
Записей в блоге: 1
03.02.2011, 21:39 6
Лучший ответ Сообщение было отмечено как решение

Решение

Vlad_IT, Это глупо.. и в с есть интересная ф-ция system..
Можно просто написать
C++
1
system("taskkill /IM game.exe")
и не мучатся с батником =)
8
Vlad_IT
1446 / 355 / 60
Регистрация: 03.04.2010
Сообщений: 2,095
03.02.2011, 21:42 7
ISergey, Ну да. Но все же это не глупо. Основа та дана. А про функцию system я не чего не знал.
PS Только почему Вы парню сразу не дали коротки код?
0
ISergey
Maniac
Эксперт С++
1435 / 939 / 156
Регистрация: 02.01.2009
Сообщений: 2,801
Записей в блоге: 1
03.02.2011, 21:49 8
Цитата Сообщение от Vlad_IT Посмотреть сообщение
PS Только почему Вы парню сразу не дали коротки код?
Он мне тоже мне не нравится =) Луче не поленится и делать как kzru_hunter показал, но там желательно еще получить права отладчика..
1
Vlad_IT
1446 / 355 / 60
Регистрация: 03.04.2010
Сообщений: 2,095
03.02.2011, 21:53 9
Цитата Сообщение от ISergey Посмотреть сообщение
Он мне тоже мне не нравится =)
Аргументируйте пожалуйста Просто я не видел в нем не чего плохого. На ту команду может и анти вирус обозлится, а на мою нет. И все же моя для отладки удобна, в той может быть много не заметных ошибок которые потом проявятся уже не у прогера а у узера. Это приведет к значительным убыткам если Автор решит продать программу.
0
ISergey
Maniac
Эксперт С++
1435 / 939 / 156
Регистрация: 02.01.2009
Сообщений: 2,801
Записей в блоге: 1
03.02.2011, 22:04 10
Цитата Сообщение от Vlad_IT Посмотреть сообщение
На ту команду может и анти вирус обозлится, а на мою нет
На system ? Особой разницы нет с вашим кодом нет.. действия то одинаковы...
Цитата Сообщение от Vlad_IT Посмотреть сообщение
И все же моя для отладки удобна
Сомневаюсь что удобно для отладки.. Вы не знаете запущен ли процесс? или был он убит потом..

Код kzru_hunter это все проверяет.. Ну в конечном итоге программа taskkill будет использовать код похожий на тот что у kzru_hunter....
1
Vlad_IT
1446 / 355 / 60
Регистрация: 03.04.2010
Сообщений: 2,095
03.02.2011, 22:22 11
Ладно все понятно. Извините . Ваш код конечно намного гибок чем мой. В Вашем можно использовать исключение ошибок. Я просто предложил свой. Удачи Вам
0
LK
Заблокирован
03.02.2011, 22:22 12
Кроме всего прочего, есть еще и такое понятие, как хороший стиль программирования, и файл .BAT туда не влезает.
0
Vlad_IT
1446 / 355 / 60
Регистрация: 03.04.2010
Сообщений: 2,095
03.02.2011, 23:05 13
Цитата Сообщение от LK Посмотреть сообщение
Кроме всего прочего, есть еще и такое понятие, как хороший стиль программирования, и файл .BAT туда не влезает.
Я же все понял
1
shpigun9825
13 / 5 / 0
Регистрация: 07.05.2013
Сообщений: 26
10.05.2014, 10:26 14
Есть способ лучше, чем батник или тасккилл.
Ставим в хедеры это:
C++
1
#include <tlhelp32.h>
Потом ставим этот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
bool IsProcessRun(char *procname)
{
bool RUN;
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 
PROCESSENTRY32 pe;
pe.dwSize = sizeof(PROCESSENTRY32);
Process32First(hSnapshot, &pe);
 
if (strcmp(pe.szExeFile, procname) == 0)
{
RUN = true;
return RUN;
}
else
RUN = false;
while (Process32Next(hSnapshot, &pe))
{
if (strcmp(pe.szExeFile, procname) == 0)
{
RUN = true;
return RUN;
}
else
RUN = false;
}
return RUN;
}
BOOL Kill(char * procname)
{
 #define PROCESS_TERMINATE (0x0001)
 BOOL ContinueLoop;
 HANDLE FSnapshotHandle;
 PROCESSENTRY32 FProcessEntry32;
 FSnapshotHandle = CreateToolhelp32Snapshot(
                                            TH32CS_SNAPPROCESS,
                                            0);
 FProcessEntry32.dwSize = sizeof(FProcessEntry32);
 ContinueLoop = Process32First(FSnapshotHandle, &FProcessEntry32);
 while (int(ContinueLoop) != 0 )
       {
        if (
           (UpperCase(ExtractFileName(FProcessEntry32.szExeFile))
           ==
           (UpperCase(procname))
           |
           (
           UpperCase(FProcessEntry32.szExeFile)==
           UpperCase(procname))
           )
           )
           {
            return int(TerminateProcess
                        (OpenProcess(PROCESS_TERMINATE,
                        BOOL(0),
                        FProcessEntry32.th32ProcessID),
                        0));
           }
        ContinueLoop = Process32Next(FSnapshotHandle,&FProcessEntry32);
 
       }
 CloseHandle(FSnapshotHandle);
 return 1;
}
bool SetDebugStatusForCurrentProc()
{
HANDLE hToken;
LUID DebugValue;
TOKEN_PRIVILEGES tkp;
 
if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES |
TOKEN_QUERY,&hToken))
        {
        return false;
        }
 
if (!LookupPrivilegeValue((LPSTR) NULL,SE_DEBUG_NAME,&DebugValue))
        {
        return false;
        }
 
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = DebugValue;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
 
AdjustTokenPrivileges(hToken,FALSE,&tkp,sizeof(TOKEN_PRIVILEGES),(PTOKEN_PRIVILEGES)
NULL,(PDWORD) NULL);
 
if (GetLastError() != ERROR_SUCCESS)
        {
        return false;
        }
 
return true;
}
Использовать можно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
bool lastcheck=0;
check:
Kill("cmd.exe");
if(IsProcessRun("cmd.exe")) 
{
SetDebugStatusForCurrentProc();
if(!lastcheck)
             {
             lastcheck=1;
             goto check;
             };
};
PS: Сори, не посмотрел на дату.
4
Мерсер
2 / 1 / 2
Регистрация: 21.07.2014
Сообщений: 30
10.09.2014, 10:38 15
у меня
C++
1
E2034 Cannot convert 'wchar_t *' to 'const char *'
в строке
C++
1
if (strcmp(pe.szExeFile, procname) == 0)
на первый параметр функции
C++
1
strcmp
Как исправить? Emarcadero XE6

Все, нашел в этой теме Cannot convert 'wchar_t *' to 'const char *'

Добавлено через 24 минуты
У кого "Project->Options->TCHAR maps to -> wchar_t", то код будет такой:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
bool IsProcessRun(wchar_t *procname)
{
bool RUN;
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 
PROCESSENTRY32 pe;
pe.dwSize = sizeof(PROCESSENTRY32);
Process32First(hSnapshot, &pe);
 
if (wcscmp(pe.szExeFile, procname) == 0)
{
RUN = true;
return RUN;
}
else
RUN = false;
while (Process32Next(hSnapshot, &pe))
{
if (wcscmp(pe.szExeFile, procname) == 0)
{
RUN = true;
return RUN;
}
else
RUN = false;
}
return RUN;
}
BOOL Kill(char * procname)
{
 #define PROCESS_TERMINATE (0x0001)
 BOOL ContinueLoop;
 HANDLE FSnapshotHandle;
 PROCESSENTRY32 FProcessEntry32;
 FSnapshotHandle = CreateToolhelp32Snapshot(
                                            TH32CS_SNAPPROCESS,
                                            0);
 FProcessEntry32.dwSize = sizeof(FProcessEntry32);
 ContinueLoop = Process32First(FSnapshotHandle, &FProcessEntry32);
 while (int(ContinueLoop) != 0 )
       {
        if (
           (UpperCase(ExtractFileName(FProcessEntry32.szExeFile))
           ==
           (UpperCase(procname))
           |
           (
           UpperCase(FProcessEntry32.szExeFile)==
           UpperCase(procname))
           )
           )
           {
            return int(TerminateProcess
                        (OpenProcess(PROCESS_TERMINATE,
                        BOOL(0),
                        FProcessEntry32.th32ProcessID),
                        0));
           }
        ContinueLoop = Process32Next(FSnapshotHandle,&FProcessEntry32);
 
       }
 CloseHandle(FSnapshotHandle);
 return 1;
}
bool SetDebugStatusForCurrentProc()
{
HANDLE hToken;
LUID DebugValue;
TOKEN_PRIVILEGES tkp;
 
if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES |
TOKEN_QUERY,&hToken))
        {
        return false;
        }
 
if (!LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&DebugValue))
        {
        return false;
        }
 
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = DebugValue;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
 
AdjustTokenPrivileges(hToken,FALSE,&tkp,sizeof(TOKEN_PRIVILEGES),(PTOKEN_PRIVILEGES)
NULL,(PDWORD) NULL);
 
if (GetLastError() != ERROR_SUCCESS)
        {
        return false;
        }
 
return true;
}
И Usage:
C++
1
2
3
4
5
6
7
8
9
10
11
12
   bool lastcheck=0;
check:
Kill("calc.exe");
if(IsProcessRun(L"calc.exe"))
{
SetDebugStatusForCurrentProc();
if(!lastcheck)
             {
             lastcheck=1;
             goto check;
             };
};
0
Avazart
Эксперт С++
7961 / 5782 / 571
Регистрация: 10.12.2010
Сообщений: 26,589
Записей в блоге: 17
10.09.2014, 15:31 16
Цитата Сообщение от ISergey Посмотреть сообщение
Vlad_IT, Это глупо.. и в с есть интересная ф-ция system..
Можно просто написать
И это тоже глупо, ибо есть TerminateProcess()
0
ISergey
Maniac
Эксперт С++
1435 / 939 / 156
Регистрация: 02.01.2009
Сообщений: 2,801
Записей в блоге: 1
10.09.2014, 16:59 17
Цитата Сообщение от Avazart Посмотреть сообщение
Vlad_IT, Это глупо.. и в с есть интересная ф-ция system..
Можно просто написать
И это тоже глупо, ибо есть TerminateProcess()
Это было показано вместо этого
C
1
2
3
4
5
6
7
8
TMemo* mem = new TMemo(this); // Создаем Memo. В этом случае лучще использовать Memo. Да и просто плохо разбираюсь с VCL
mem->Text = "taskkill /IM game.exe"; //Записываем с mem команду для командной строки. game.exe это процес
mem->Lines->SaveToFile("task.bat");  // Создаем так называемый батник. Он служит для перидачи команд в командную строку Windows
ShellExecute(Handle, "open", "task.bat", NULL, NULL, SW_RESTORE); //после чего запускаем созданный нами батник, что приводим к завершению процеса game.exe
Sleep(1000); //задержка обязательна, так как надо дать завершить процес прежде чем удалять батник.
DeleteFile("task.bat"); //Теперь прощаемся с батником. Удаляем его. :( Но это не обязательно. Только если вы не хотите что-бы узер решивший запустить батник не заверщил процес
 
//на этом все. Удачи Вам!
0
1212roma
0 / 0 / 1
Регистрация: 05.08.2016
Сообщений: 4
17.12.2016, 14:56 18
Также если хочется завершать процесс как-нибудь по другому
C
1
system("TASKKILL /?");
Он покажет справку
0
MegaBatcher2000
Химия, программирование
1 / 1 / 0
Регистрация: 20.01.2018
Сообщений: 40
Завершенные тесты: 1
09.07.2019, 15:54 19
Цитата Сообщение от Avazart Посмотреть сообщение
И это тоже глупо, ибо есть TerminateProcess()
Например, на Windows NT 4.0 такая функция (по-моему) работает только на простые приложения.
0
Avazart
Эксперт С++
7961 / 5782 / 571
Регистрация: 10.12.2010
Сообщений: 26,589
Записей в блоге: 17
09.07.2019, 16:26 20
Что такое Windows NT 4.0 ?
0
09.07.2019, 16:26
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.07.2019, 16:26

Некорректно завершить приложение
Всем доброго времени суток. Друзья всем знакомо когда завершаеться приложени и выскакивает окошко...

Правильно завершить поток
Здравствуйте!!! Делаю программу через поток. Вот код #include &lt;vcl.h&gt; #pragma hdrstop ...

Как правильно завершить приложение?
Close(); //или Application-&gt;Terminate(); как правильно?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.