C ++ - 如何在应用程序退出时执行命令?

时间:2014-08-04 15:49:09

标签: c++ winapi eventhandler application-close function-exit

我是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;
    }
}

如果这是一种正确的方法,我想知道如何使用这个处理程序?我是否需要在我的程序中创建这样的处理程序并且不断更新?

我很感激任何帮助 纳斯

4 个答案:

答案 0 :(得分:7)

在这种情况下,适当的RAII使用会对您有所帮助。

这基本上就是说将资源所有权包装在对象中。然后,您可以在程序启动时创建一个对象,并在程序结束时清除所有资源:

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

DeviceManager dm;  //namespace scope, single translation unit
在进入dm之前,

main()将在程序启动时初始化,并将在程序结束时发布。

答案 1 :(得分:0)

虽然您可以为各种关闭事件添加特殊处理程序,但您应该考虑使用所谓的RAII(资源获取是初始化)以更面向对象的方式设计资源控制。这种设计模式涉及一个类,其创建初始化底层设备,其析构函数关闭并清理底层设备。因此,无论该类的所有者如何被销毁,该设备都将被关闭。

答案 2 :(得分:0)

我确保将我的项目拆分为硬件驱动程序,使硬件保持理智状态,并将用户界面呈现给用户。

这样,当用户界面关闭时,驱动程序继续运行,清理然后才结束。当UI被强制关闭时,这也可以工作,例如,在系统关闭时,或使用任务管理器。

您可能需要查看UMDF了解更多详情。

答案 3 :(得分:0)

有一个标准的库函数atexit,它允许你注册一个在程序正常退出时调用的回调函数。

要处理异常终止,您可以使用异常处理程序。使用catch {}中或之后的处理代码的简单try {} / catch {}块应该足以满足大多数简单程序的需要。有关高级设置,请参阅结构化异常处理here