控制台程序终止时调用特定函数

时间:2014-09-04 11:37:47

标签: c windows

我在Windows上,我希望在程序终止时调用特定的函数。

例如:

void close_program()
{
    /*do stuff*/
    printf("Goodbye.\n");
}

我尝试atexit()但它只适用于临时和常规退出,例如调用函数exit()或者主函数返回操作系统的值。

我发现HandlerRoutine()似乎是一个解决方案,因为Windows会向用户关闭的进程发送CTRL_CLOSE_EVENT值信号(通过任务管理器关闭按钮或结束任务)。问题是我尝试了一段非常基本的代码,并且说明了HandlerRoutine'未定义的引用。它返回1。

这段代码:

#include <stdio.h>
#include <windows.h>

int main()
{
    while(1)
    {
         if(HandlerRoutine(CTRL_CLOSE_EVENT))
         {
              printf("Program is being terminated...\n");
         }
     }
     return 0;
}

我使用MinGW。

知道问题可能是什么?

根据MSDN,不需要联系。

3 个答案:

答案 0 :(得分:3)

HandlerRoutine是将在终止控制台时调用的回调函数。这不是您必须调用的函数,而是您的函数的签名(定义为HANDLER_ROUTINE)(将由Windows本身调用):

BOOL WINAPI HandlerRoutine(DWORD dwCtrlType);

您将检查dwCtrlType以检查CTRL_CLOSE_EVENT返回(通常)TRUE。要附加您的函数并调用它,您必须使用SetConsoleCtrlHandler() API函数,如下所示:

BOOL YourHandler(DWORD dwCtrlType)
{
    if (CTRL_CLOSE_EVENT == dwCtrlType)
    {
    }

    return TRUE;
}

现在你有了自己的功能,但是你指示Windows调用它:

int main()
{
    SetConsoleCtrlHandler((PHANDLER_ROUTINE)YourHandler, TRUE);

    // Do your stuff here

    return 0;
}

请注意,您可以注册多个处理程序,它们将被链接到返回TRUE的处理程序。有关完整示例,请参阅MSDN

答案 1 :(得分:0)

尝试明确包含wincon.h。我知道windows.h会自动包含许多子头文件,但由于依赖性,许多这些文件不能简单地包含在内(它们不是自包含的)。 wincon.h是一个用于控制台服务的子头文件。

答案 2 :(得分:0)

从您关联的MSDN页面

  

HandlerRoutine是应用程序定义的函数名称的占位符。

您需要做的是创建一个回调(PHANDLER_ROUTINE类型),然后使用SetConsoleCtrlHandler注册此回调。