winapi — Как выполнить команду при выходе из приложения?

Я очень плохо знаком с C ++ и недавно начал проект, для которого мне нужно получить доступ к устройству, собрать определенные данные и переслать их в поток данных в локальной сети.

Хотя мое приложение выполняет все необходимые функции, ему не хватает функции: когда я закрываю окно, в котором запущено приложение, оно не останавливает аппаратное устройство. В результате мне приходится выполнять аппаратный сброс каждый раз, когда я заканчиваю работу с программой. Это не только неудобно, но и невозможно для использования по назначению.

Я просто хочу установить функцию обратного вызова для функции, которая выполняется, когда программа закрыта (либо нажав x, нажав Alt-F4 и т. Д.)

Это возможно? У меня есть возможность создать обработчик для таких событий:

BOOL WINAPI ConsoleHandler(DWORD dwCtrlEvent)
{
switch (dwCtrlEvent)
{
case CTRL_CLOSE_EVENT:
// something
case CTRL_SHUTDOWN_EVENT:
// the same?
default:
return FALSE;
}
}

Если это правильный подход, мне интересно, как использовать этот обработчик? Нужно ли создавать такой обработчик в моей программе, и обновление происходит постоянно?

Я благодарен за любую помощь
Jonas

1

Решение

Правильное использование RAII поможет вам в этом случае.

Это в основном говорит об обёртывании владения ресурсами внутри объектов. Затем вы можете создать объект при запуске программы и очистить все ресурсы в конце программы:

struct DeviceManager
{
DeviceManager() { InitDevice(); }
~DeviceManager() { DecativateDevice(); }
};

DeviceManager dm;  //namespace scope, single translation unit

dm будет инициализирован при запуске программы, до входа в main() и будет выпущен в конце программы.

7

Другие решения

Хотя вы можете добавить специальные обработчики для различных событий выключения, вам следует рассмотреть возможность разработки управления ресурсами более объектно-ориентированным способом, используя так называемый RAII (получение ресурсов — это инициализация). Этот шаблон проектирования предполагает наличие класса, создание которого инициализирует базовое устройство, а деструктор закрывает и очищает базовое устройство. Таким образом, как бы ни был уничтожен владелец этого класса, устройство будет закрыто.

0

Я бы позаботился о том, чтобы мой проект был разделен на аппаратный драйвер, поддерживающий аппаратное состояние в нормальном состоянии и пользовательский интерфейс, предоставляющий данные пользователю.

Таким образом, когда пользовательский интерфейс закрыт, драйвер продолжает работать, очищается и только после этого завершает работу. Это также работает, когда пользовательский интерфейс принудительно закрыт, например, при выключении системы или с помощью диспетчера задач.

Вы можете посмотреть в УФСТ Больше подробностей.

0

Там есть стандартная функция библиотеки atexit, что позволяет зарегистрировать обратный вызов, который будет вызываться при нормальном выходе из программы.

Для обработки аварийного завершения вы можете использовать обработчик исключений. Простого блока try {} / catch {} с кодом обработки в или после catch {} должно быть достаточно для большинства простых программ. Для расширенной настройки обратитесь к структурированной обработке исключений Вот.

0
По вопросам рекламы [email protected]