Главная Фотки Сказка Программизмы Гостевая EnglishEnglish

Перезапуск приложения своими руками

Application Before Restart Application While Restarting Application After Restart
Шаг 1. Приложение в исходном виде Шаг 2. Перезапусакем... Шаг 3. Приложение после перезапуска

Часто во время работы программы требуется выполнить её перезапуск. Например, скачано обновление программы или необходимо сменить язык интерфейса. Для пользователя в таких случаях гораздо понятнее когда после проведения изменений в настройках задается вопрос типа "А не хотите ли перезапустиь программу сейчас?"

В ходе решения этой задачки получилось небольшой кусочек кода, позволяющий реализовать перезапуск добавлением нескольких строчек.

Краткая инструкция по использованию

Шаг 1.

Включите "RestartAPI.h" в ваш "stdafx.h" и добавте в проект "RestartAPI.cpp"

Шаг 2.

В функцию main или WinMain

добавьте следующий код:
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPTSTR lpstrCmdLine, int nCmdShow)
{
	// Initialize restart code
	// Check if this instance is restarted and 
	// wait while previos instance finish
	if (RA_CheckForRestartProcessStart())
		RA_WaitForPreviousProcessFinish();
	//
	//
	// Your WinMain Code here
	//
	//
	// Finish restarting process if needed
	RA_DoRestartProcessFinish();
	return 0;
}
		
Либо, если вы используете MFC в CYourApp.InitInstance
	if (RA_CheckForRestartProcessStart())
		RA_WaitForPreviousProcessFinish();
		
и в CYourApp.ExitInstance
	RA_DoRestartProcessFinish();
		

Шаг 3.

В месте где требуется выполнить перезапуск приложения добавьте вызов RA_ActivateRestartProcess

. Например так:
LRESULT CMainDlg::OnBnClickedRestart(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
	// Initialize restart proceess
	if (!RA_ActivateRestartProcess())
	{
		::MessageBox(NULL, _T("Something Wrong"), _T("Restart App"), MB_OK|MB_ICONEXCLAMATION);
		return 0;
	}
	// Terminate application.
	CloseDialog(IDC_RESTART);
	return 0;
}
		

Все что нужно для перезапуска сделано. Теперь приложение спобно завершить работу и запустить свою копию с измененными настройками.

Краткая справка по функциям

Макросы

#define RA_CMDLINE_RESTART_PROCESS	TEXT("--Restart")

Ключ командной строки для приложения в режиме перезапуска

Можно переопределить ключ, если вам не нравится этот. Перезапущенное приложение будет запускаться с этим ключом в командной строке

#define RA_MUTEX_OTHER_RESTARTING	TEXT("YOUR_RESTART-MUTEX_NAME")

Имя мьютекса

Именованный мьютекс используется для ожилания завершения одной копии приложения перед запуском другой копии. Имя мьютекса должно быть уникальным. Для обеспечения уникальности можно использовать GUID. Например вот так: #define RA_MUTEX_OTHER_RESTARTING TEXT("APPRESTART-E476AE82-AA92-11DA-ACE4-006098EFC07C")

Функции

BOOL RA_CheckProcessWasRestarted();

Возвращает TRUE, если текущий процесс перезапущен

BOOL RA_CheckForRestartProcessStart();

Проверяет ключ командной строки. Возвращает TRUE, если текущий процесс перезапущен

BOOL RA_WaitForPreviousProcessFinish();

Ожидает завершения предыдущего эккземпляра программы

BOOL RA_DoRestartProcessFinish();

Должна вызывыаться в конце работы процесса. Освобождает мютекс.

BOOL RA_ActivateRestartProcess();

Эта функция активирует механизм перезапуска. Вызывать нужно когда требуется перезапуск приложения. После вызова необходимо завершить работу текущего экземпляра.


Вариант на английском языке на CodeProject


Наверх
Программизмы


ICQ UIN:My Icq63179813 (Добавить меня, Сообщение для меня)

e-mail:  Александр Алексеев

© 2002-2006 Александр Алексеев
Hosted by uCoz