我在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,不需要联系。
答案 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注册此回调。