Главная Фотки Сказка Программизмы Гостевая | 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:63179813
(Добавить меня,
Сообщение для меня) e-mail: Александр Алексеев |
© 2002-2006 Александр Алексеев |