Win32 控制台应用程序意外终止,代码为 58

问题描述 投票:0回答:1

在我的系统上,以下代码(用 Zig 编写,使用 zigwin32 绑定到 WinAPI)在生成的控制台关闭后返回错误代码 58:

const std = @import("std");
const win32 = @import("zigwin32/win32.zig");
const foundation = win32.foundation;
const console = win32.system.console;

// Overrides default behvior, including CTRL_CLOSE_EVENT
fn consoleHandler(_: u32) callconv(.C) foundation.BOOL {
    return 1;
}

pub fn wWinMain(_: foundation.HINSTANCE, _: ?foundation.HINSTANCE, _: [*c]const u16, _: c_int) c_int {
    std.debug.assert(console.AllocConsole() != 0);
    std.debug.assert(console.SetConsoleCtrlHandler(consoleHandler, 1) != 0);

    while (true) {}

    return 0;
}

有人可以向我解释一下为什么会发生这种情况吗?

在我看来,程序永远不应该停止,因为没有显式的

ExitProcess
调用,并且
while
循环永远不会退出。我认为程序结束的唯一方法是控制台的事件在单独的线程上运行并关闭主线程,返回 58,但我不确定为什么或如何发生这种情况。

windows winapi console-application
1个回答
0
投票

在我看来,程序永远不应该停止,因为没有显式的 ExitProcess 调用

不是你,不。但实际上有一个。它正在被操作系统调用。

我认为程序结束的唯一方法是控制台的事件在单独的线程上运行

这就是发生的事情

与 SetConsoleCtrlHandler 函数一起使用的应用程序定义函数。控制台进程使用此函数来处理进程接收到的控制信号。 当收到信号时,系统会在进程中创建一个新线程来执行该函数。

当控制台窗口关闭时,将调用 CTRL_CLOSE_EVENT 的处理程序列表,如果有任何返回 TRUE(如您的那样),则该进程将立即终止。

CTRL_CLOSE_EVENT、CTRL_LOGOFF_EVENT 和 CTRL_SHUTDOWN_EVENT 信号使进程有机会在终止前进行清理。 HandlerRoutine 可以执行任何必要的清理,然后执行以下操作之一:

调用ExitProcess函数终止进程。
返回假。如果注册的处理程序函数均未返回 TRUE,则默认处理程序将终止该进程。
返回 TRUE。在这种情况下,不会调用其他处理函数,系统会终止该进程。

因此,控制台处理程序无法阻止进程终止,它只能控制是否调用后续处理程序。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.