Регистрация для перезапуска приложения
Чтобы зарегистрировать приложение для перезапуска, вызовите функцию RegisterApplicationRestart . отчеты об ошибках Windows (WER) перезапустит приложение, если оно выполнялось не менее 60 секунд, прежде чем перестанет отвечать на запросы или возникнет необработанное исключение.
Также следует рассмотреть возможность регистрации для восстановления, которая позволяет сохранять данные и сведения о состоянии, которые могут быть полезны при перезапуске приложения WER. WER перезапустит приложение после завершения процесса восстановления, если вы также зарегистрируетесь для восстановления.
После завершения процесса восстановления WER завершает работу приложения, а затем перезапускает его. Для консольных приложений приложение запускается в отдельном окне консоли, которое закрывается при выходе из приложения.
Примечание для авторов установщиков приложений: Регистрация для перезапуска приложения также приведет к тому, что Windows автоматически перезагрузит приложение после перезагрузки компьютера в случаях, когда компьютер перезагружается из-за обновления программного обеспечения. Для этого установщик приложения должен вызвать функцию ExitWindowsEx с установленным флагом EWX_RESTARTAPPS или функцию InitiateShutdown с флагом SHUTDOWN_RESTARTAPPS.
В следующем примере показано, как зарегистрироваться для перезапуска приложения. Пример вызывает нарушение доступа после регистрации для перезапуска приложения. Нарушение доступа будет подхвачено отчеты об ошибках Windows и продемонстрирует взаимодействие пользователя с отчетами об ошибках, включая перезапуск приложения. Его следует запускать из окна консоли без аргументов командной строки.
#include #include #include #define RESTART_SWITCH L"/restart" void GetRestartInfo(int argc, wchar_t* argv[], BOOL* pfIsRestart, DWORD* pdwRecordId); DWORD InitApplication(BOOL fIsRestart, DWORD* pdwRecordId); BOOL WINAPI CtrlHandler(DWORD dwControlType); DWORD WINAPI Recover(PVOID pContext); // A simple example to show how to use application recovery. For simplicity, // the state information (record ID) is passed as part of the command line. void wmain(int argc, wchar_t* argv[]) < HRESULT hr = S_OK; DWORD dwRecordId = 0; BOOL fIsRestart = FALSE; GetRestartInfo(argc, argv, &fIsRestart, &dwRecordId); if (FAILED(hr = InitApplication(fIsRestart, &dwRecordId))) < wprintf(L"Failed to initialize the application.\n"); goto cleanup; >// Do work. If you have a lot of state information, you should // periodically persist the state information to save time // in the recovery process. // The application must exist for at least 60 seconds for the // application to be restarted. Use Sleep() to mimic 60 seconds // worth of work. wprintf(L"Sleeping. \n"); Sleep(62 * 1000); // Set the record ID to verify restart value. dwRecordId = 10; // Generate an access violation to force a restart. If we've already // restarted just exit because the example already demonstrated // the restart feature. if (FALSE == fIsRestart) < wprintf(L"Causing access violation. \n"); int* p = NULL; *p = 5; >cleanup: wprintf(L"Exiting. \n"); > // Get the restart info from the command line. The command line is // of the form, /restart -r . The application // is being restarted if the first argument is /restart. void GetRestartInfo(int argc, wchar_t* argv[], BOOL* pfIsRestart, DWORD* pdwRecordId) < if (argc >1) < if (!wcsncmp(RESTART_SWITCH, argv[1], sizeof(RESTART_SWITCH))) < *pfIsRestart = TRUE; *pdwRecordId = _wtoi(argv[3]); >> > // Initialize the application. If this is a restart, use the state // information to reset the state of the application. This example // does not fail the initialization process if the process of // registering for application recovery and restart failed. DWORD InitApplication(BOOL fIsRestart, DWORD* pdwRecordId) < DWORD status = ERROR_SUCCESS; // Set only if the initializing the application fails, HRESULT hr = S_OK; // not if registering for recovery and restart fails. WCHAR wsCommandLine[RESTART_MAX_CMD_LINE]; wprintf(L"Entering InitApplication. \n"); if (fIsRestart) < // TODO: Use the record ID to initialize the application. wprintf(L"Restart record ID is %lu\n", *pdwRecordId); >else < // This is not a restart, so initialize the application accordingly. >// Register for restart. The command line is updated in the recovery callback. RtlZeroMemory(wsCommandLine, sizeof(wsCommandLine)); StringCchPrintf(wsCommandLine, sizeof(wsCommandLine), L"/restart -r %lu", *pdwRecordId); hr = RegisterApplicationRestart(wsCommandLine, RESTART_NO_PATCH | RESTART_NO_REBOOT); if (FAILED(hr)) < // Not failing because the registration failed. wprintf(L"RegisterApplicationRestart failed with ox%x.\n", hr); goto cleanup; >// Register the callback that handles the control event notifications. // Used for recovery when an installer is updating a component of the // application. if (!SetConsoleCtrlHandler(CtrlHandler, TRUE)) < // Not failing initialization because the registration failed. // Consider calling UnregisterApplicationRestart if you must // have the latest state information. wprintf(L"SetConsoleCtrlHandler failed.\n"); goto cleanup; >// Register the callback that handles recovery when the application // encounters an unhandled exception or becomes unresponsive. hr = RegisterApplicationRecoveryCallback(Recover, pdwRecordId, RECOVERY_DEFAULT_PING_INTERVAL, 0); if (FAILED(hr)) < // Not failing initialization because the registration failed. // Consider calling UnregisterApplicationRestart if you must // have the latest state information. wprintf(L"RegisterApplicationRecoveryCallback failed with ox%x.\n", hr); goto cleanup; >cleanup: return hr; > // Implement the callback for handling control character events. // You'd implement this callback if an installer could update a // component of your application. The system sends a CTRL_C_EVENT // notification when an installer needs to shutdown your application // or restart the computer in order to complete the installation. // You can use the CTRL_C_EVENT to save final state information or // data before exiting. BOOL WINAPI CtrlHandler(DWORD dwControlType) < wprintf(L"Entering CtrlHandler. \n"); switch (dwControlType) < case CTRL_C_EVENT: wprintf(L"Handling CTRL_C_EVENT\n"); return FALSE; // Other cases go here. default: wprintf(L"Other, %ul\n", dwControlType); return FALSE; >> // Implement the recovery callback. This callback lets the application // save state information or data in the event that the application // encounters an unhandled exception or becomes unresponsive. DWORD WINAPI Recover(PVOID pContext) < HRESULT hr = S_OK; BOOL bCanceled = FALSE; DWORD dwRecordId = *(DWORD*)pContext; WCHAR wsCommandLine[RESTART_MAX_CMD_LINE]; wprintf(L"Entering Recover callback. \n"); // Do recovery work. // Update the restart command line. RtlZeroMemory(wsCommandLine, sizeof(wsCommandLine)); StringCchPrintf(wsCommandLine, sizeof(wsCommandLine), L"/restart -r %lu", dwRecordId); hr = RegisterApplicationRestart(wsCommandLine, RESTART_NO_PATCH | RESTART_NO_REBOOT); if (FAILED(hr)) < // Not failing because the registration failed. wprintf(L"RegisterApplicationRestart failed with ox%x.\n", hr); >// You must call the ApplicationRecoveryInProgress function within // the specified ping interval or the recovery callback exits. // Typically, you would do a block of work, call the function, and repeat. hr = ApplicationRecoveryInProgress(&bCanceled); if (bCanceled) < wprintf(L"Recovery was canceled by the user.\n"); goto cleanup; >// Do more recovery work. // You could also call the RegisterApplicationRestart function to // update the command line used for the restart. cleanup: // Save the state file. wprintf(L"Leaving Recover callback. \n"); ApplicationRecoveryFinished((bCanceled) ? FALSE: TRUE); return 0; >
Обратная связь
Были ли сведения на этой странице полезными?
Все о режиме совместимости в Windows 11
Режим совместимости в Windows 11 позволит исправить работу старых программ и игр, которые в предыдущих операционных системах запускались некорректно. Данный режим подходит как для решения проблем с запуском, так и с отображением содержимого в приложении, например, когда оно открывается с небольшим разрешением или есть разные размытия и другие дефекты изображения. Сначала предлагаем разобраться с самостоятельным выбором параметров совместимости для запуска конкретной программы или игры.
-
Щелкните правой кнопкой мыши по некорректно работающему приложению и из появившегося контекстного меню выберите пункт «Свойства».
Запуск средства устранения проблем с совместимостью
Не всегда пользователю известна истинная причина проблем с совместимостью, а стандартный параметр с переключением режима на конкретную Windows тоже не гарантирует стопроцентного успеха. В таком случае предлагается использовать средство устранения проблем с совместимостью. В нем пользователю задаются наводящие вопросы по работу софта, а затем автоматически применяются подходящие настройки.
-
Вы можете перейти к упомянутому средству через вкладку «Совместимость» в свойствах конкретной программы, щелкнув по кнопке с соответствующим названием.
Чаще всего режим совместимости используется для решения проблем при запуске старых игр. Если вы относитесь к такому числу пользователей и выяснили, что выполнение разных настроек не дало должного эффекта, возможно, понадобится выполнить другие варианты, связанные с работой старых играх в новых ОС. Детальнее об этом читайте в другом материале на нашем сайте, перейдя по ссылке ниже.
Виктор Бухтеев Вам помогли мои советы?
Задайте вопрос или оставьте свое мнение Отменить комментарий
1 комментарий
Аноним :
Большое спасибо, всё быстро получилось. Пригодился способ №3.
Зарегистрируйте эту программу для перезагрузки что это
Будь в курсе последних новостей из мира гаджетов и технологий
iGuides для смартфонов Apple
Как настроить автоматический перезапуск открытых приложений после перезагрузки Windows 10
Пользователь удален — 31 мая 2020, 13:16
По умолчанию после перезагрузки Windows начинают открываться только те приложения, которые находятся в автозагрузке. Однако временами хочется, чтобы система перезапускала все открытые приложения на момент выключения ПК, и в майском обновлении Windows 10 (2004) такая функция была добавлена.
Включить ее можно в Параметрах > Учетные записи > Варианты входа:
Однако тут есть нюансы. Например, вы решили выключить ПК, и какое-то приложение остановило этот процесс, ибо вы не сохранили в нем прогресс. Вы, разумеется, отменяете выключение, чтобы сохранить свои данные. Однако при этом другие программы уже закрылись, и если вы после спасения своей информации снова начнете выключение компьютера, то после его повторного включения они не откроются.
Также есть проблема — некоторые программы, особенно старые, могут игнорировать желание системы перезапустить их после повторного включения ПК. И если вы заметили такое поведение, то найдите .exe такого приложения, нажмите на него правой кнопкой мыши, выберите пункт «Свойства», перейдите в открывшемся окне на вкладку «Совместимость» и поставьте галку напротив пункта «Зарегистрируйте эту программу для перезагрузки»:
Следует понимать, что эта галка — не тоже самое, что внесение в автозагрузку: последнее будет запускать программу при каждом старте системы, а регистрация для перезагрузки только в том случае, если приложение было запущено в момент выключения ПК.
Ну и последний нюанс — возможность настроить, когда именно начнут перезапускаться приложения. За это отвечает пункт в Параметрах на той же вкладке, но ниже: он называется «Использовать мои данные для входа для автоматического завершения настройки устройства после перезапуска или обновления»:
Если вы поставите на нем галку, то при включении компьютера будет совершен автоматический заход в систему с вашими данными с моментальной последующей блокировкой (то есть пароль вводить придется). Однако этот заход позволит начать загружаться программам из автозагрузки и тем, которые были открыты до выключения ПК.
Если же вы галку уберете, то после включения компьютера система будет ждать от вас введения пароля, и лишь после этого начнет запускать приложения.
Перезапускаемые приложения в Windows 11: как включить и настроить
И дело тут не только в том, что надо искать exe-шники, изучать настройки и потом вручную прописывать их в системе. Проблема больше в том, что не все приложения для этого годятся, а сама Windows 11 по умолчанию их не сортирует.
Тем не менее, разобраться не так и сложно. При желании, конечно.
Как включить перезагружаемые приложения в Windows 11
С этим, как мы уже сказали, проблем вообще никаких. Открываем «Параметры«, затем — «Учетные записи» и «Варианты входа«, прокручиваем окно чуть вниз до раздела «Дополнительные параметры» и включаем функцию «Автоматически сохранять мои перезапускаемые приложения из системы и перезапускать их при повторном входе«.
Теперь после выключения/включения компа и Windows 11 будет автоматом запускать все перезапускаемые приложения. Но только те, которые, во-первых, работали на момент выключения ПК, и, во-вторых, для которых данная функция была включена.
Открыть и проверить список перезапускаемых приложений можно следующим образом:
- открываем Диспетчер задач (Ctrl+Shift+Esc);
- переходим в раздел «Автозагрузка приложений» (в колонке слева);
- и мониторим список программ, которые в системе на данный момент зарегистрированы, как перезапускаемые, и для которых включена включена опция автоперезапуска;
- тут же можно включить/выключить эту опцию для каждой отдельной проги в списке.
И как видим, в списке среди прочих программ числятся также некоторые системные, автозагрузку для которых отключать не рекомендуется. Иначе могут быть (и будут) проблемы с функционированием самой Windows 11.
Поэтому, когда наблюдаем в списке незнакомые названия, то авозагрузку для них лучше пока не отключать — до выяснения, так сказать…
Как добавить новое приложение в список перезапускаемых
Делается это посредством внесения определенных изменений в свойства исполнительного файла соответствующей программы. А для этого:
- находим и открываем папку приложения на диске (адрес по умолчанию C:\Program Files (x86)\, если прога не была специально установлена на какой-то другой диск);
- в папке находим exe-файл программы (которым она стандартно запускается);
- кликаем правой кнопкой мыши по названию и в открывшемся меню жмем «Свойства«;
- в окошке свойств переходим во вкладку «Совместимость«;
- активируем опцию «Зарегистрируйте эту программу для перезагрузки» (ставим флажок в чек-боксе);
- жмем «Применить» и «ОК» ниже и закрываем окно.
После этого Windows 11 зарегистрирует прогу, как перезапускаемую, и будет загружать её автоматически после каждого перезапуска. Но , опять же, только при условии, что приложение эту функцию поддерживает (поддержка должным образом прописана в коде программы на этапе её разработки).
Но так как даже сегодня поддерживают её далеко не все программы для Windows, то после включения в обязательном порядке проверяем сначала наличие проги в списке автозагрузки (см. выше), а затем её фактический автозапуск после перезагрузки компа.