Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.07.2013, 22:16   #1
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию Закрыть консольное приложение при повторном запуске с аргументом "-exit"

Как понимаю, без отдельного потока, который бы вызывал ExitProcess(), обойтись не получится.

Но как обойтись без цикла?
Smogg вне форума Ответить с цитированием
Старый 06.07.2013, 22:21   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

если при повторном запуске есть этот параметр, то надо искать первый экземпляр среди процессов и убивать его.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 06.07.2013, 22:36   #3
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Спасибо. Действительно, так будет проще всего.
Smogg вне форума Ответить с цитированием
Старый 06.07.2013, 23:14   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Убивать процесс - не самое лучшее решение. Предполагается, что этот процесс чтото делает и если убить его "просто так" можно повредить/потерять данные. Гораздо лучше послать процессу Ctrl-Break сигнал через GenerateConsoleCtrlEvent()
waleri вне форума Ответить с цитированием
Старый 07.07.2013, 18:39   #5
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

А можно в трех словах, как с этим работать?

У меня криво выходит:
Код:
	for (int i = 0; i < argc ; i++)
	{	
		wT = argv[i];

		if (wT == wsArg_exit)
		{
 			if (!g_hConsoleHwnd)
 				return 0;
 						
			GetWindowThreadProcessId(g_hConsoleHwnd, &dwProcessId);
			
			if (dwProcessId)
			{				
				if (!GenerateConsoleCtrlEvent( CTRL_BREAK_EVENT, dwProcessId))
					{
						FreeConsole();
						AttachConsole(dwProcessId);
						if (!GenerateConsoleCtrlEvent( CTRL_BREAK_EVENT, NULL))
						{
							return 0;
						}

				};

				HANDLE hPrev = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);
				TerminateProcess( hPrev, 0);
				CloseHandle(hPrev);			
				return 0;
			}
		}
	}
При первом вызове GenerateConsoleCtrlEvent( CTRL_BREAK_EVENT, dwProcessId) с параметром dwProcessId получается ошибка 87 - "Неверный параметр".
При повторном GenerateConsoleCtrlEvent( CTRL_BREAK_EVENT, NULL) с параметром NULL и с приаттаченой к тому процессу моей консоли, при запуске из .bat-файла вылазит запрос:
"Завершить выполнение пакетного файла? Y/N"

TerminateProcess( hPrev, 0) отрабатывается без вопросов.

Последний раз редактировалось Smogg; 07.07.2013 в 19:12.
Smogg вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
При запуске VS выдает сообщение "exception has been thrown by the target of an invocation" hackgirl Софт 0 08.10.2011 00:59
При запуске ругается:"не хватает памяти..." kim_klim Свободное общение 3 19.01.2011 15:39
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04
При запуске открывает "Центр справки и поддержки" tiken14 Помощь студентам 2 18.05.2009 23:31
"Ошибка приложения" при запуске мидлета hotman Общие вопросы по Java, Java SE, Kotlin 0 04.09.2008 15:16