Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: как программно убить другое приложение?  (Прочитано 36805 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« : 22-08-2008 11:14 » 

Есть основное приложение, которое стартует другие приложения ( с помощью ShellExecute).
Я хочу при окончании работы основного приложения остановить выполнение тех ехе-шек, которые он стартовал в процессе работы.

Теоретически нужна следующая последовательность:
Код:
	CWnd* pWnd = FindWindow ( "", "имя ехе");
DWORD dwId, dProcId;
dwId = GetWindowThreadProcessId (pWnd->m_hWnd, &dProcId);
HANDLE hProc = ::OpenProcess (PROCESS_ALL_ACCESS, false, dwId);
UINT uExitCode;
BOOL bIsTerminated = TerminateProcess (hProc, uExitCode );

Проблема возникает сразу на FindWindow () - она возвращает pWnd = NULL.
Ехешник называется FS.exe.
Вопрос:
1)что тут не так?
2) можно ли все это вообще сделать по-другому?

Мне казалось, что это где-то уже обсуждалось, но соответствующую тему я так и не нашла.
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #1 : 22-08-2008 11:25 » 

забыла дописать, что не хотела применять стандартную схему:

Код:
	STARTUPINFO cif;
ZeroMemory(&cif,sizeof(STARTUPINFO) );
PROCESS_INFORMATION pi;

if ( CreateProcess("E:\\fs.exe",NULL,NULL,NULL,FALSE,NULL,NULL,NULL,&cif,&pi) )
{
TerminateProcess(pi.hProcess,NO_ERROR);
}

т.к. в обычной жизни мне скорее всего придется подчищать то, что создано не мной.
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #2 : 22-08-2008 12:08 » 

все, нашла ошибку! "" и NULL все-таки разные вещи однако... Надо было
             FindWindow ( NULL, "FS");

И общий вариант, видимо, должен быть таким:

   CWnd* pWnd = FindWindow ( NULL, "FS");
   DWORD dwId, dProcId;
   dwId = GetWindowThreadProcessId (pWnd->m_hWnd, &dProcId);
   HANDLE hProc = ::OpenProcess (PROCESS_ALL_ACCESS, false, dwId);
   UINT uExitCode = NO_ERROR;
   // это не есть хорошо, т.к. не происходит аккуратная очистка памяти от хлама
   //BOOL bIsTerminated = TerminateProcess (hProc, uExitCode );
   CloseHandle (hProc);
   // это должно быть наиболее корректным (ИМХО)
   ::SendMessage (pWnd->m_hWnd, WM_CLOSE, 0, 0);

Единственный вопрос, который остается - есть ли другие варианты?
(перебор через CreateToolhelp32Snapshot()-Process32First()-Process32Next() нехорош тем, что для некоторых версий винды нужен EnumProcesses() вместо CreateToolhelp32Snapshot(), поэтому мне эта идея не очень-то нравится. Если я неправа, скажите пожалуйста! )
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 23-08-2008 05:58 » 

Цитата
"" и NULL все-таки разные вещи однако
ну так то да "" - это указатель const char* , и по этому адресу валяется 0 , а NULL - это тупо 0 (вернее (void*)0 , но это неважно)

у меня с давних пор валяется такая процедура убиения:
Код:
void KillProcess(const char* const pExeName)
{
DWORD ID;
CString ExeName=pExeName;
if(!GetProcessByExeName(ExeName,&ID))return;

HANDLE hpr=0;
hpr=::OpenProcess(PROCESS_TERMINATE,0,ID);

if(!hpr)
{
CString txt;

//жёстко прибить процесс и все дочерние процессы
txt.Format(" /c C:\\windows\\system32\\taskkill.exe /pid %d /f /t",ID);
::st_RunProcessAndWaitWhenDone(csSystem32__+"cmd.exe",txt);

}
else
{
::TerminateProcess(hpr,0);
::CloseHandle(hpr);
}

return;
}

//использование -
KillProcess("имя_процесса");

правда, "C:\\windows\\system32\\" в пути к taskkill.exe надо всё же более корректно доставать , а то систему могут и не на C поставить ))
« Последнее редактирование: 23-08-2008 06:02 от Алексей1153++ » Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 23-08-2008 06:04 » 

например так

Код:
//путь к системной папке
CString GetSystemPATH__()
{
CString result="";
int len=MAX_PATH+1;
char* chSys=new char[len];
::memset(chSys,0,len);
if(!::GetSystemDirectory(chSys,len))return "";
result=chSys;
result+="\\";
delete [] chSys;
chSys=0;
return result;
}
Записан

Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #5 : 25-08-2008 07:02 » 

Леш,

спасибочки!  Улыбаюсь Есть только одно "НО": скажи мне пожалуйста, что у тебя стоит в твоей функции st_RunProcessAndWaitWhenDone() и что кроется за переменной csSystem32__? А черт его знает...
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 25-08-2008 07:15 » 

ага.. Вот что значит - давно порядок не наводил в функциях ))) Вырвал из проекта, поэтому так вышло.

Код:
//Запускает процесс и ждёт, пока он не завершится
//вернёт false , если не удало запустить процесс
bool st_RunProcessAndWaitWhenDone(
//HWND hwnd,
const char* szApplicationName,
const char* szCommandLine_i=0,
const char* szCurrentDirectory=0,
DWORD dwdTimeOut_i=-1)
{

STARTUPINFO StartupInfo;
PROCESS_INFORMATION ProcessInfo;
DWORD dwRetValue;

::memset(&StartupInfo,0,sizeof(StartupInfo));
StartupInfo.cb=sizeof(StartupInfo);

CString csCommandLine=szCommandLine_i;//это обязательно!!!

if(!::CreateProcess(
szApplicationName,(char*)(const char*)csCommandLine,
0,0,0,NORMAL_PRIORITY_CLASS,0,szCurrentDirectory,
&StartupInfo,&ProcessInfo))
{
//ошибка
//DWORD dwdErr=GetLastError(); //определяем ошибку
return false;
}
else
{
::CloseHandle(ProcessInfo.hThread);
::WaitForSingleObject(ProcessInfo.hProcess, dwdTimeOut_i);
::GetExitCodeProcess(ProcessInfo.hProcess, &dwRetValue);
::CloseHandle(ProcessInfo.hProcess);
}
return true;
}


а csSystem32__ - это "C:\\windows\\system32\\"
« Последнее редактирование: 25-08-2008 07:16 от Алексей1153++ » Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 25-08-2008 07:20 » 

насчёт
Код:
	//это обязательно
CString csCommandLine=szCommandLine_i;
- уж не помню, почему, вроде как для сохранения исходного содержимого строки szCommandLine_i
Записан

Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #8 : 25-08-2008 08:37 » 

Леш,

спасибочки! Получилось!  Да-да
Я уже думаю, а не подвесить ли к теме файлик с решением? Мож кому-то еще пригодится?
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #9 : 25-08-2008 09:34 » 

Обязательно подвесить. И коменты к нему кратенько. Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #10 : 25-08-2008 10:05 » 

Ирин, подвесить и переделать мой косячный древний код по человечьи Улыбаюсь А то я сам никогда не доберусь Улыбаюсь)
Записан

Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #11 : 25-08-2008 10:57 » 

Рапортую - сделано!;-)
Единственная проблема- я не могу в тхт-файл загнать русский шрифт, поэтому все комменты набрала в кириллице (если их пропустить через транслит.ру, то все будет в порядке). А загонять в ворд - потом будут сдвинуты все форматирования кода...
Поэтому - если у кого-то будет время откорректировать файл и подвесить его опять с русскими текстами, заранее благодарю. Если нет - тот, кому надо будет, разберется и так.

Да, Леш, если сможешь - посмотри свой код в моей обработке, может увидишь мои ошибки - исправь пожалуйста.

* kill_process.txt (10.45 Кб - загружено 1350 раз.)
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #12 : 25-08-2008 11:36 » 

я дома гляну, а кстати - почему это ворд попортив всё ? Ничего подобного Улыбаюсь
Записан

Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #13 : 25-08-2008 11:40 » 

Ты знаешь, я несколько раз так копировала код в ворд, а потом при переносе в студию развлекалась с форматированием, т.к. все сдвигалось без особой логики.
Может у меня просто предубеждение? Ага
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #14 : 26-08-2008 03:55 » 

сорри, домой пришёл - уснул ))

---------------
про ворд - ну я даже статьи писал в ворде - ничего не теряется. Я всю ***-ю автоматику отключил - видать это у тебя портит код

как вариант, попробуй:
1) из ворда сначала копировать в блокнот, потом из блокнота в студию
2) в студии - попробуй выделить код и нажать alt+F8
« Последнее редактирование: 26-08-2008 03:59 от Алексей1153++ » Записан

Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #15 : 26-08-2008 09:08 » 

Ну так здорово, что уснул! Сон - дело святое!
Наверное ты прав - это привет автоматике. Я в ворде не меняю настройки, т.к. часто приходится обрабатывать какие-то документы, а я не всегда вспомню, где и что я отключила Ага
А насчет этой комбинации клавиш я не знала, спасибо!

Так, сделала ворд-файл с русским текстом. Прикрепила. теперь есть 2 варианта Ага

* kill_process.doc (75.5 Кб - загружено 1024 раз.)
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #16 : 26-08-2008 10:00 » 

гляну дома, попытка №2, часть №1 Улыбаюсь))
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #17 : 26-08-2008 18:13 » 

ну, в принципе, я только комментарии подправил и спецификаторы расставил (static)


* kill_process.txt (10.79 Кб - загружено 1151 раз.)
Записан

Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #18 : 27-08-2008 08:31 » 

Леш,
спасибочки! Я к сожалению посмотреть не могу - в ноуте только Не понял вместо рускких букв вижу ;-(
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #19 : 27-08-2008 08:45 » 

прикольно... тоже в доке пристегнуть что ли ?
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #20 : 27-08-2008 08:51 » 

а так если

* kill_process_unicode.txt (21.59 Кб - загружено 1026 раз.)
Записан

Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #21 : 27-08-2008 10:12 » 

Леш, теперь вообще прикол - я вижу русский текст, но форматорование умерло нафиг! и все пробелы и новые строки отображаются квадратиками и прочеми загогулинами Ага
Брось ты это грязное дело! Кому надо будет - разберется - есть уже 4 варианта!
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #22 : 27-08-2008 10:38 » 

не, ещё в ворде дома попробую )
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #23 : 27-08-2008 10:47 » 

блин да картинку сделайте и всё! Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #24 : 27-08-2008 10:49 » 

я проще придумало Улыбаюсь

Код:
см далее по постам ...
« Последнее редактирование: 27-08-2008 17:58 от Алексей1153++ » Записан

Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #25 : 27-08-2008 11:12 » 

Леш,
ты умница! Еще раз спасибо за комментарии!
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #26 : 27-08-2008 11:22 » 

завсегда пожалуйста Улыбаюсь
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #27 : 27-08-2008 11:25 » 

Ну хдеж умница? А табуляция где? И потом - признавайтесь - у кого из вас включена опция ставить пробел между именем ф-ции и круглой скобкой? "Это в каких это таких академиях вас этому обучали?"  (с) Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #28 : 27-08-2008 11:28 » 

я же сказал - ничего не правил, кроме комментариев и static )
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #29 : 27-08-2008 11:32 » 

Так, ладно, один отмазался. Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines