Malaja
|
|
« : 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
|
|
« Ответ #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
|
|
« Ответ #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(), поэтому мне эта идея не очень-то нравится. Если я неправа, скажите пожалуйста! )
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
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++ »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
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
|
|
« Ответ #5 : 25-08-2008 07:02 » |
|
Леш, спасибочки! Есть только одно "НО": скажи мне пожалуйста, что у тебя стоит в твоей функции st_RunProcessAndWaitWhenDone() и что кроется за переменной csSystem32__?
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
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++ »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #7 : 25-08-2008 07:20 » |
|
насчёт //это обязательно CString csCommandLine=szCommandLine_i;
- уж не помню, почему, вроде как для сохранения исходного содержимого строки szCommandLine_i
|
|
|
Записан
|
|
|
|
Malaja
|
|
« Ответ #8 : 25-08-2008 08:37 » |
|
Леш, спасибочки! Получилось! Я уже думаю, а не подвесить ли к теме файлик с решением? Мож кому-то еще пригодится?
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
Джон
просто
Администратор
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."
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #10 : 25-08-2008 10:05 » |
|
Ирин, подвесить и переделать мой косячный древний код по человечьи А то я сам никогда не доберусь )
|
|
|
Записан
|
|
|
|
Malaja
|
|
« Ответ #11 : 25-08-2008 10:57 » |
|
Рапортую - сделано!;-) Единственная проблема- я не могу в тхт-файл загнать русский шрифт, поэтому все комменты набрала в кириллице (если их пропустить через транслит.ру, то все будет в порядке). А загонять в ворд - потом будут сдвинуты все форматирования кода... Поэтому - если у кого-то будет время откорректировать файл и подвесить его опять с русскими текстами, заранее благодарю. Если нет - тот, кому надо будет, разберется и так.
Да, Леш, если сможешь - посмотри свой код в моей обработке, может увидишь мои ошибки - исправь пожалуйста.
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #12 : 25-08-2008 11:36 » |
|
я дома гляну, а кстати - почему это ворд попортив всё ? Ничего подобного
|
|
|
Записан
|
|
|
|
Malaja
|
|
« Ответ #13 : 25-08-2008 11:40 » |
|
Ты знаешь, я несколько раз так копировала код в ворд, а потом при переносе в студию развлекалась с форматированием, т.к. все сдвигалось без особой логики. Может у меня просто предубеждение?
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #14 : 26-08-2008 03:55 » |
|
сорри, домой пришёл - уснул ))
--------------- про ворд - ну я даже статьи писал в ворде - ничего не теряется. Я всю ***-ю автоматику отключил - видать это у тебя портит код
как вариант, попробуй: 1) из ворда сначала копировать в блокнот, потом из блокнота в студию 2) в студии - попробуй выделить код и нажать alt+F8
|
|
« Последнее редактирование: 26-08-2008 03:59 от Алексей1153++ »
|
Записан
|
|
|
|
Malaja
|
|
« Ответ #15 : 26-08-2008 09:08 » |
|
Ну так здорово, что уснул! Сон - дело святое! Наверное ты прав - это привет автоматике. Я в ворде не меняю настройки, т.к. часто приходится обрабатывать какие-то документы, а я не всегда вспомню, где и что я отключила А насчет этой комбинации клавиш я не знала, спасибо! Так, сделала ворд-файл с русским текстом. Прикрепила. теперь есть 2 варианта
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #16 : 26-08-2008 10:00 » |
|
гляну дома, попытка №2, часть №1 ))
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #17 : 26-08-2008 18:13 » |
|
ну, в принципе, я только комментарии подправил и спецификаторы расставил (static)
|
|
|
Записан
|
|
|
|
Malaja
|
|
« Ответ #18 : 27-08-2008 08:31 » |
|
Леш, спасибочки! Я к сожалению посмотреть не могу - в ноуте только вместо рускких букв вижу ;-(
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #19 : 27-08-2008 08:45 » |
|
прикольно... тоже в доке пристегнуть что ли ?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #20 : 27-08-2008 08:51 » |
|
а так если
|
|
|
Записан
|
|
|
|
Malaja
|
|
« Ответ #21 : 27-08-2008 10:12 » |
|
Леш, теперь вообще прикол - я вижу русский текст, но форматорование умерло нафиг! и все пробелы и новые строки отображаются квадратиками и прочеми загогулинами Брось ты это грязное дело! Кому надо будет - разберется - есть уже 4 варианта!
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #22 : 27-08-2008 10:38 » |
|
не, ещё в ворде дома попробую )
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
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."
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #24 : 27-08-2008 10:49 » |
|
я проще придумало
|
|
« Последнее редактирование: 27-08-2008 17:58 от Алексей1153++ »
|
Записан
|
|
|
|
Malaja
|
|
« Ответ #25 : 27-08-2008 11:12 » |
|
Леш, ты умница! Еще раз спасибо за комментарии!
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #26 : 27-08-2008 11:22 » |
|
завсегда пожалуйста
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
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."
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #28 : 27-08-2008 11:28 » |
|
я же сказал - ничего не правил, кроме комментариев и static )
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
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."
|
|
|
|