Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Убиение нескольких процессов 
V
    Опции темы
Noman
Дата 27.4.2007, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 21.4.2007
Где: /mnt/Nowhere

Репутация: нет
Всего: нет



 Доброго времени суток, уважаемые программисты.

Вопрос мой такой - мне нужно уничтожить 5 процессов одновременно и\или проверить их существование. Подробнее ситуация такая:
 Есть 5 полей ввода (сама программа написана на C++ Builder 6), данные из которых идут в ini-файл. Оттуда эти данные читаются.
Основная задача в том, что нужна функция, которая могла бы сработать проверить наличие процессов, и, при их наличии, через промежуточный символ (образно зпт),  или для каждого по отдельности - их убить, а при их отсутствии или бездействовать или вывести сообщение (не столь принципиально). Я поспрошал людей, поискал в сети и все что нашел, это:
Код

SendNotifyMessage( HWND_BROADCAST, ...) ;
 
и это:
Код

BroadcastSystemMessage(BSF_IGNORECURRENTTASK + BSF_NOTIMEOUTIFNOTHUNG, BSM_APPLICATIONS, WM_DESTROY, 0, 0);


 Более подробной информации мне найти не удалось, разве что на microsoft-е. Но и там я много не понял...
PM MAIL WWW ICQ   Вверх
SenkraD
Дата 28.4.2007, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: 4
Всего: 23



можеш почитать сдесь и здесь

А также вот те пример работы с процессами на Builder


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
Noman
Дата 30.4.2007, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 21.4.2007
Где: /mnt/Nowhere

Репутация: нет
Всего: нет



Что-то я все же никак не придумаю, как мне поступить...
Есть такой вариант:
Код

DWORD GetProcessByExeName(AnsiString ExeN)
{
DWORD id;
HANDLE hProcessSnap = NULL;
PROCESSENTRY32 pe32 = {0};
AnsiString temp="";
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
pe32.dwSize=sizeof(PROCESSENTRY32);
if(Process32First(hProcessSnap,&pe32)) temp = pe32.szExeFile;
pe32.dwSize=sizeof(PROCESSENTRY32);
while(Process32Next(hProcessSnap,&pe32))
{
temp = pe32.szExeFile;
pe32.dwSize = sizeof(PROCESSENTRY32);
if (temp == ExeN)
{
id = pe32.th32ProcessID;
CloseHandle(hProcessSnap);
return id;
}
}
CloseHandle(hProcessSnap);
return false;
}
bool KillProcByPid(DWORD id)
{
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, TRUE, id);
if(INVALID_HANDLE_VALUE != hProcess)
{
TerminateProcess(hProcess, 0);
CloseHandle(hProcess);
}
return 0;
}
void __fastcall TMain::ButtonClick(TObject *Sender)
{
  AnsiString ExeName;
 DWORD Pid = 0;
 ExeName = "process.exe";
 Pid = GetProcessByExeName(ExeName);
 KillProcByPid(Pid);
}

 Работает это хорошо, но.... Но это завершает только 1 процесс, а мне нужно 1-5.
Я сделал так, что при пустом поле любого из Edit-ов в файл ini идет 0. Соответственно, если процесс есть, то туда записывается его имя.
Возможно есть вариант использовать цикл, который бы проверял процессы на наличие 0, и пропускал бы такие, но я не могу сообразить, как мне это обыграть....
 Подскажите, кто знает...

Это сообщение отредактировал(а) Noman - 30.4.2007, 19:36
PM MAIL WWW ICQ   Вверх
Noman
Дата 2.5.2007, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 21.4.2007
Где: /mnt/Nowhere

Репутация: нет
Всего: нет



Up! Вопрос еще актуален. Товарищи, подскажите, кто знает...
PM MAIL WWW ICQ   Вверх
Syberex
Дата 3.5.2007, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 15.9.2006
Где: Украина

Репутация: нет
Всего: нет



Код

void KillDemon(void)
{
 // найти и убить
 int x=0;
 DWORD *pid = new DWORD;
 while(x<50)
 {
 GetProcessByExeName(pid,"calc.exe");
 KillProcByPid(*pid);
 x++;
 };
 delete pid;
 }

--------------------
whole power in artificial intelligences
PM MAIL ICQ   Вверх
ama_kid
Дата 3.5.2007, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 5
Всего: 95



Вобщем-то, Syberex ответил, но...
Просто ради интереса встречный вопрос: а зачем тебе убивать процессы?  smile Это ведь не совсем правильно в конечном счете... Судя по тому, что
Цитата(Noman @  27.4.2007,  21:49 Найти цитируемый пост)
Есть 5 полей ввода (сама программа написана на C++ Builder 6), данные из которых идут в ini-файл. Оттуда эти данные читаются.
у тебя эти поля в данном ini-файле являются для убиваемых процессов некими параметрами и есть предположение, что после убивания ты их снова хочешь запускать для актуализации настроечной информации. Если так, тогда не проще ли будет просто посылать твоим пяти процессам нотификацию об изменении конфигурации для повторного считывания? Если я неправильно понял - тогда актуален только первый вопрос  smile 


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
Noman
Дата 3.5.2007, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 21.4.2007
Где: /mnt/Nowhere

Репутация: нет
Всего: нет



 Спасибо, что ответили  smile 

ama_kid, сейчас я объясню.
 Вообщем суть самой программы такова.
Некоторые приложения мешают компу "уснуть", то бишь перевестись в спящий режим.
Для этого я пишу данную программу. В те поля ввода вводятся названия процессов, и при нажатии кнопки или таймеру, процессы "убиваются" и комп уходит в спячку.
 Я понимаю, что TerminateProcess() - это очень нехорошая вещь, которая оставляет хвосты и загруженные dll, и действительно целесообразнее было бы "попросить" их закрыться, а уже при отказе "убить" их. Но я боюсь, что моих знаний не хватит.
 Кстати этот ini по сути только для того, чтобы сохранить настройки, введенные пользователем.

А как работает Broadcast? Может лучше использовать его?... Я пытался найти информацию по-поводу этого, но мне мало что удалось узнать об этом...
PM MAIL WWW ICQ   Вверх
Noman
Дата 9.5.2007, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 21.4.2007
Где: /mnt/Nowhere

Репутация: нет
Всего: нет



Долго меня не было...
 Сейчас сел за билдер, и почувствовал полное отсутствие мыслей.
Пытаюсь понять код который привел Syberex...
Получается так.
Объявили функцию:
Код

void KillDemon(void)
{

Объявили переменную x и присвоили ей нулевое значение.
Далее объявили pid:
Код

 int x=0;
 DWORD *pid = new DWORD;

Значит пока x меньше 50 цикл выполняется, с каждым проходом увеличиваясь на 1. Это понятно.
После окончания цикла переменная pid удаляется. Это тоже понятно.
Не понятно только одно. Здесь есть конкретное имя процесса. А в моем варианте его нет...
Но есть имена массивов, с названиями процессов или, если они не были введены, то 0-ями.
Их названия cpa, cpb, cpc, cpd, cpe, а вынуты они с помощью strcpy ().
Код

 while(x<50)
 {
 GetProcessByExeName(pid,"calc.exe");
 KillProcByPid(*pid);
 x++;
 };
 delete pid;
 }


 При компиляции получаю ошибки следующего содержания:
Код

[C++ Error] Unit1.cpp(232): E2034 Cannot convert 'unsigned long *' to 'AnsiString'
[C++ Error] Unit1.cpp(232): E2342 Type mismatch in parameter 'ExeN' (wanted 'AnsiString', got 'unsigned long *')
[C++ Error] Unit1.cpp(232): E2227 Extra parameter in call to GetProcessByExeName(AnsiString)

 Если я напишу так:
Код

 int x=0;
 DWORD *pid = new DWORD;
 while(x<50)
 {
 GetProcessByExeName(pid,cpa[0]);
 KillProcByPid(*pid);
 x++;
 }
 delete pid;

то получаю примерно те же ошибки. Теоретически массив передает char, а не AnsiString.
 Значит мне будет нужно переконвертировать их, и использовать 5 раз для каждого процесса? Или я что-то не так понял?

 Заранее спасибо и прошу прощения за собственную тупость...  smile 
PM MAIL WWW ICQ   Вверх
Syberex
Дата 10.5.2007, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 15.9.2006
Где: Украина

Репутация: нет
Всего: нет



некорректно как то у тебя получается,а зачем тебе надо имена процессов, не легче ли определить по именам пиды процессов и занести их в массив???
--------------------
whole power in artificial intelligences
PM MAIL ICQ   Вверх
Noman
Дата 13.5.2007, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 21.4.2007
Где: /mnt/Nowhere

Репутация: нет
Всего: нет



Странно, я ответил, а он не прошел. Глюк  smile 

Вообщем добил я ее, спасибо всем. Особенно Syberex. На это "чудо" можно посмотреть на этой страничке (там и исходники и бинарник). Но большая просьба отнестись снисходительно и ногами не пинать  smile  Все-таки это мое первое, относительно "большое" приложение...


Это сообщение отредактировал(а) Noman - 13.5.2007, 22:57
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1125 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.