Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как программно завершить процесс чужого приложения? (Bornald C++ Builder 6.0)

408
24 февраля 2007 года
Lei fang
265 / / 01.10.2005
Здрасте всем)
В общем мне необходимо программно завершать работу чужого приложения (консольного), говорят что с SendMessage тут бывают глюки, поэтому надо завершить процесс этого приложения...
есть у меня код:
Код:
Код:
//сначала необходимо создать снимок состояния системы
        HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
        HANDLE hProcess;
        //параметр TH32CS_SNAPPROCESS означает, что мы хотим узнать только информацию о процессах
        bool Result = true;
        bool Find = false;
        //опишем структуру, в которой будет храниться эта информация
        PROCESSENTRY32 *ProcEntry = new PROCESSENTRY32();
        AnsiString FileName;

        //Поиск запущенной программы T-Mail
        Process32First(hSnapshot, ProcEntry);
        FileName = ExtractFileName(StrPas(ProcEntry->szExeFile));
        if(FileName == "T-MAILNT.EXE")
        {
                hProcess = OpenProcess(PROCESS_TERMINATE, false, ProcEntry->th32ProcessID);
                //Программа найдена
                Find = true;
                //Вырубаем ее
                if(TerminateProcess(hProcess, 0)) //Ok
                else {} //Косяк :-(
        }
        //Вызываемые функции - булевские. Поэтому, когда вернется false, значит, информации боьше нет. => можно использовать цикл

        while(Result)
        {
                Result = Process32Next(hSnapshot, ProcEntry);
                if(Result)
                {
                        FileName = ExtractFileName(StrPas(ProcEntry->szExeFile));
                        if(FileName == "T-MAILNT.EXE")
                        {
                                hProcess = OpenProcess(PROCESS_TERMINATE, false, ProcEntry->th32ProcessID);
                                //Программа найдена
                                Find = true;
                                //Вырубаем ее
                                if(TerminateProcess(hProcess, 0)) //Ok
                                else {} //Косяк :-(
                                break;
                        }
                }
        }
        delete ProcEntry;
        //выгрузим из памяти системный снимок
        CloseHandle(hSnapshot);
        if(!Find) //Программа не найдена :-(

Он не работает, так как автор забыл сказать какие библиотеки подключить или как объявить эти функции... Я не знаю как их объявить. Если кто-то знает как заставить этот код работать или другой способ завершить процесс, то напишите пожалуйста)
1
24 февраля 2007 года
kot_
7.3K / / 20.01.2000
[SIZE="6"]{$BCB}\Exemples\Apps\ProcView[/SIZE]
19K
25 февраля 2007 года
Termi_uc
33 / / 13.02.2007
Цитата: Lei fang
...
Он не работает, так как автор забыл сказать какие библиотеки подключить или как объявить эти функции... Я не знаю как их объявить. Если кто-то знает как заставить этот код работать или другой способ завершить процесс, то напишите пожалуйста)


Код приведённый выше код работает по-другому, нежели {$BCB}\Exemples\Apps\ProcView. Функции, используемые в приведённом выше коде, находятся в ToolHelp.DLL - библиотеке Microsoft, для получения сведений о системе. Для компиляции подключи заголовочный файл tlhelp32.h.

Но, в общем случае, подойдёт {$BCB}\Exemples\Apps\ProcView (присоединяюсь к мнению kot_).

1
25 февраля 2007 года
kot_
7.3K / / 20.01.2000
Цитата: Termi_uc
Код приведённый выше код работает по-другому, нежели {$BCB}\Exemples\Apps\ProcView. Функции, используемые в приведённом выше коде, находятся в ToolHelp.DLL - библиотеке Microsoft, для получения сведений о системе. Для компиляции подключи заголовочный файл tlhelp32.h.

Но, в общем случае, подойдёт {$BCB}\Exemples\Apps\ProcView (присоединяюсь к мнению kot_).


Тогда еще либу необходимо добавить к проекту.

408
27 февраля 2007 года
Lei fang
265 / / 01.10.2005
Ок, спасибо, код заработал... теперь возникла другая проблема...
Я пишу удаленный рестартер одной проги... мое приложение-сервер должно завершать ее процесс... но во какая хрень получается, когда я подключаюсь к своему приложению клиентом и из клиента даю команду завершить процесс, то приложение-сервер не завершает процесс почему-то. На приложении-сервере я сделал кнопку с тем же кодом завершения, но и при ее нажатии процесс не завершается пока подключен клиент. Как только я отключаюсь от приложения-сервера то при нажатии на ту кнопку приложение-сервер уже завершает процесс. Я так подозреваю что это какая-то система защиты или что-то в этом роде... Как обойти это? Стоит выкладывать тут мои сервер и клиент или ничего нельзя сделать?
499
27 февраля 2007 года
madjahed
149 / / 14.01.2004
Цитата: Lei fang
Ок, спасибо, код заработал... теперь возникла другая проблема...
Я пишу удаленный рестартер одной проги... мое приложение-сервер должно завершать ее процесс... но во какая хрень получается, когда я...



Можно использовать CreateRemoteThread(). Создать поток в чужом процессе и из него завершить процесс.

408
27 февраля 2007 года
Lei fang
265 / / 01.10.2005
Цитата: madjahed
Можно использовать CreateRemoteThread(). Создать поток в чужом процессе и из него завершить процесс.


О_О честное слово совсем не понимаю что мне и как делать. "Создать поток в чужом процессе" и тем более как из него завершить процесс... может меня не правильно поняли...

499
28 февраля 2007 года
madjahed
149 / / 14.01.2004
Цитата: Lei fang
О_О честное слово совсем не понимаю что мне и как делать. "Создать поток в чужом процессе" и тем более как из него завершить процесс... может меня не правильно поняли...



hProcess, полученный OpenProcess(), а всё отсальное - стандартное.

HANDLE CreateRemoteThread(

HANDLE hProcess,
LPSECURITY_ATTRIBUTES lpThreadAttributes, // pointer to thread security attributes
DWORD dwStackSize, // initial thread stack size, in bytes
LPTHREAD_START_ROUTINE lpStartAddress, // =ThreadFunc
LPVOID lpParameter, // pointer to argument for new thread
DWORD dwCreationFlags, // creation flags
LPDWORD lpThreadId // pointer to returned thread identifier
);

DWORD WINAPI ThreadFunc( LPVOID )
{
ExitProcess(0);
}

408
01 марта 2007 года
Lei fang
265 / / 01.10.2005
Ок, спасибо... хоть я так ничего и не понял, но я по другому сделал) клиент посылает не команду на рестарт, а то что должен сделать таймер и отключается) Прокатило, хоть и не удобно...
408
03 декабря 2008 года
Lei fang
265 / / 01.10.2005
Понимание пришло со временем :D Я тогда был еще маленьким и глупеньким.
С помощью CreateRemoteThread можно создать в калькуляторе поток, в котором сокет будет принимать подключения от клиентов? О_О
Или есть какие-то ограничения?
14
03 декабря 2008 года
Phodopus
3.3K / / 19.06.2008
Можно. Ограничения ставят антивирусы и фаирволлы.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог