Во-первых, позвольте мне извиниться: я не отвечу на конкретное «CTRL_LOGOFF_EVENT», на которое вы ссылаетесь, но на общую функцию, которую вы пытаетесь выполнить: «выполнить функцию при выходе пользователя из системы».
Общий способ сделать:
Насколько я знаю, нет никакого общего способа сделать.
Вы можете попробовать различные решения:
- ловит события как вы
- используя try catch / finally
- порождает таймеры окон и реагирует на него
- порождает потоки, которые будут ждать окончания основного потока
Но (насколько я знаю) у всех них есть слабость в способе закрытия или в другом.
Например, недавно мне пришлось бороться с плохо закодированным dll, который я должен был использовать. Эта DLL вызывала «выход (0)». Я не нашел элегантного способа изящно справиться с этим поведением.
Мне пришлось запустить его в отдельном процессе (не в потоке), который я отслеживал из своего основного процесса. Это много работы для реализации и поддержания для простого результата.
Другой подход:
В зависимости от того, что вы пытаетесь сделать, хорошей практикой может быть постепенное выполнение «последней» операции с использованием формата, позволяющего восстановить частично записанные файлы.
Это то, что я обычно делаю, но это всегда зависит от того, чего вы пытаетесь достичь.
Например, если вы пытаетесь очистить свое рабочее пространство, вы можете:
- сделать это при запуске, если это не было сделано в предыдущем запуске
- работа во временных папках
В другом случае, если у вас очень длинный процесс и вы хотите сгенерировать сводный файл, вы можете:
- время от времени генерирует частичный сводный файл
- при создании нового файла вы перемещаете предыдущий
таким образом, у вас будет частичный сводный файл на каждом этапе вашего процесса.