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

Ваш аккаунт

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

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

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

Завершение чужой программы из моей

389
09 января 2004 года
Dmitri
69 / / 20.08.2000
Подскажите, пожалуйста, как реализовать завершение чужой программы из моей, зная при этом Caption и имя .exe проги, которую надо закрыть? Т.е., фактически надо "прибить" процесс нужной мне проги из моей проги. Как такое сделать?

Очень был бы рад исходнику или хотя бы примерному коду функции, которая это дело делает.
1.6K
09 января 2004 года
Tdr
154 / / 13.11.2003
Могу помочь только теоритически... так, с ходу, не помню...

В ВинАПИ есть функция, которая позволяет получить список процессов. У каждого из процессов есть pid, это типа его идентификатор. Имеешь его, даешь команду через winexec (опять-же не помню :)) на завершение процесса с этим pid. Я еще поковыряю мануалы, у меня это где-то есть...
1.6K
10 января 2004 года
Tdr
154 / / 13.11.2003
Во, нашел то что надо! В первыхшагах было.



\\\ Часть 1 из 2 \\\\\\\\\\\\\\\\

Шаг 32 - Сканируем список процессов.
В прошлом шаге мы убедились, что у нас нет инструмента, с помощью которого мы можем просмотреть список всех процессов в Windows 98. Но мы можем такой инструмент создать. В свое время Microsoft создала специальную библиотеку ToolHelp.Dll, используя которую можно получить доступ к информации о системе. Вот мы с ее помощью и попробуем получить список процессов.
Итак, давайте создадим приложение на базе MFC AppWizard и как Dialog Based. Поместим на диалог кнопку и элемент управления ListBox, который свяжем с помощью ClassWizard с переменной m_List1 типа Control и напишем код реакции на нажатие кнопки:

// ScanProcessDlg.cpp : implementation file
//

#include "stdafx.h"
#include "ScanProcess.h"
#include "ScanProcessDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#include "tlhelp32.h"

......

void CScanProcessDlg::OnScan()
{
m_List1.ResetContent();
HANDLE hSnap;
hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnap == NULL)
{
AfxMessageBox("Error Load ToolHelp");
}
PROCESSENTRY32 proc;
if (Process32First(hSnap, &proc))
{
m_List1.AddString(proc.szExeFile);
while (Process32Next(hSnap, &proc))
{
m_List1.AddString(proc.szExeFile);
}
}
}

В заголовочном файле tlhelp32.h находятся описания функций.
Если вы посмотрите результат работы этой программы, то увидите, что процессов намного больше. В том числе и сможете увидеть процессы, которые не видели в прошлом шаге.
1.6K
10 января 2004 года
Tdr
154 / / 13.11.2003
/// Часть 2 из 2 //////////////

Шаг 33 - Win98 как NT. Убиваем процесс.
Итак, мы с Вами получили список процессов. Теперь на диалоговую панель добавим новую кнопку Terminate Process. Если в списке выделен процесс, то по нажатию на эту кнопку процесс будет удален. Вот код.
void CScanProcessDlg::OnTernimate()
{
int inIndex;
inIndex=m_List1.GetCurSel();
if (inIndex!=LB_ERR)
{
CString csExName;
m_List1.GetText(inIndex,csExName);
HANDLE hSnap;
hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnap == NULL)
{
AfxMessageBox("Error Load ToolHelp");
}
else
{
PROCESSENTRY32 proc;
if (Process32First(hSnap, &proc))
{
if (csExName==proc.szExeFile) TerminateProcess(hSnap,0);
while (Process32Next(hSnap, &proc))
{

if (csExName==proc.szExeFile)
{
HANDLE ProcessHandle=NULL;
ProcessHandle = OpenProcess(SYNCHRONIZE, TRUE, proc.th32ProcessID);
if (ProcessHandle!=NULL)
{
TerminateProcess(ProcessHandle,0);
CloseHandle(ProcessHandle);
Sleep(5000);
OnScan();
}
else AfxMessageBox("Not Open Process");
}
}
CloseHandle(hSnap);
}
}
}
else AfxMessageBox("Select Process");
}

Сначала проверяем выбран ли элемент списка if (inIndex!=LB_ERR). Если выбран пробегаем по процессам. Код повторяется как при сканировании процесса. Конечно можно было создать массив при сканировании. Но процесс дело тонкое, то он есть, а то его нет. Лучше на мой взгляд просканировать еще раз. Если его находим, то открываем с помощью функции OpenProcess(). Дальше спокойно вызываем TerminateProcess.
HANDLE OpenProcess
(
DWORD dwDesiredAccess, // флаг доступа
BOOL bInheritHandle, // флаг наследования
DWORD dwProcessId // идентификатор процесса
);

Идентификатор процесса мы берем из структуры PROCESSENTRY32 - это переменная, которая заполняется при запуске.
BOOL TerminateProcess(
HANDLE hProcess, // Указатель процесса
UINT uExitCode // Код возврата процесса
);

Задержку я сделал для того, чтобы обновить список через некоторое время, так как удаление процесса не моментальное дело. Программу я испытывал на Windows 98. Удаляет все процессы кроме Kernel :) Оно и понятно, сам себя удалять не будешь. При этом помните шаг "Шаг 31 - Программа, которая не удаляется из списка задач". Отсюда удалить ее можно и это получается. Кроме того удалить можно и процесс оболочки. Все работает как в NT. Отсюда рождается много интересных вещей. Например, можно выяснить почему тормозит Windows. Многие процессы просто не нужны для работы. Попробуйте поудаляйте.
1.6K
10 января 2004 года
Unexpected
137 / / 09.12.2002
Убить процесс это конечно круто, но слишком кардинально. Вында при этом может освободить не все ресурсы, занятые программой. (по крайней мере так утверждают :))
Тем более, что при этом программа (закрываемая) не получает никаких сообщений и не имеет возможности сохранить то, что успела наработать.
Если известен Caption - лучше воспользоваться API-шной FindWindow и послать окну wm_quit (а если будет сопротивляться, тогда уж и процесс прибить можно :))
1.6K
12 января 2004 года
Tdr
154 / / 13.11.2003
Unexpected, поддерживаю!;)
12K
06 января 2006 года
chrono
34 / / 03.01.2006
Спасибо тебе Tdr мне это тоже очень надо было.
[COLOR=red]*Thank*, RESPECT![/COLOR] ;)
246
06 января 2006 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by Dmitri
Подскажите, пожалуйста, как реализовать завершение чужой программы из моей, зная при этом Caption и имя .exe проги, которую надо закрыть? Т.е., фактически надо "прибить" процесс нужной мне проги из моей проги. Как такое сделать?

Очень был бы рад исходнику или хотя бы примерному коду функции, которая это дело делает.


Кто не в курсе - поиск работает.
http://forum.codenet.ru/showthread.php?s=&threadid=25868&highlight=PROCESSENTRY32

http://forum.codenet.ru/showthread.php?s=&threadid=26222&highlight=PROCESSENTRY32

и т.д.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог