| Главная Фотки Сказка Программизмы Гостевая |
English
|
Перезапуск приложения своими руками
Часто во время работы программы требуется выполнить её перезапуск. Например, скачано обновление программы или необходимо сменить язык интерфейса. Для пользователя в таких случаях гораздо понятнее когда после проведения изменений в настройках задается вопрос типа "А не хотите ли перезапустиь программу сейчас?" В ходе решения этой задачки получилось небольшой кусочек кода, позволяющий реализовать перезапуск добавлением нескольких строчек. Краткая инструкция по использованиюШаг 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: e-mail: Александр Алексеев |
© 2002-2006 Александр Алексеев |