gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 14:14:40 26 4
gpt4 key购买 nike

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

例如:

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

我试过 atexit() 但它只适用于临时和常规退出,例如调用函数 exit() 或当 main 返回一个值给操作系统。

我发现 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无需链接。

最佳答案

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

BOOL WINAPI HandlerRoutine(DWORD dwCtrlType);

您将检查 dwCtrlType 以检查返回(通常)TRUECTRL_CLOSE_EVENT。要附加您的函数并调用它,您必须使用 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 .

关于控制台程序终止时调用特定函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25664504/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com