gpt4 book ai didi

visual-studio-2005 - Windows 8 上的 FreeConsole 行为

转载 作者:行者123 更新时间:2023-12-04 12:28:36 30 4
gpt4 key购买 nike

在 Windows 8 上,我们遇到了 FreeConsole 问题。它似乎关闭了 stdio 句柄,而不关闭文件流。

这可能是 Windows 8 的问题,也可能是我根本不理解 Windows 控制台/GUI 应用程序子系统的(完全荒谬的)方式。

这是怎么回事?

下面的最小示例。使用编译器测试:VS2005、VS2013、VS2017,使用静态链接的 CRT。

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

static void testHandle(FILE* file) {
HANDLE h = (HANDLE)_get_osfhandle(fileno(file));
DWORD flags;
if (!GetHandleInformation(h, &flags)) {
MessageBoxA(0, "Bogus handle!!", "TITLE", MB_OK);
}
}

int main(int argc, char** argv)
{
freopen("NUL", "wb", stdout); // Demonstrate the issue with NUL
// Leave stderr as it is, to demonstrate the issue with handles
// to the console device.

FreeConsole();

testHandle(stdout);
testHandle(stderr);
}

最佳答案

由先前的 Windows 8 标准(未重定向)控制台句柄(由 GetStdHandle 返回)导致的问题,其中实际上是伪句柄,其值不与其他内核对象句柄相交,因此在被 FreeConsole '关闭'后写入该伪句柄总是失败.
在 Win8 中 MS 改变了一些东西,所以 GetStdHandle 返回指的是控制台子系统驱动程序对象的正常内核对象句柄(实际上该驱动程序也只出现在 Win8 中)。所以 FreeConsole 关闭了那个句柄。最有趣的是 CRT 在启动时执行 GetStdHandle 并将返回值保存在内部某处,并在任何地方使用访问 std::in/out/err 的调用 C 函数。由于 FreeConsole 关闭了该句柄,并且它不再是一个特殊的伪句柄值 - 任何其他打开的内核对象句柄都可以重用相同的句柄值,如果在这种情况下它不是文件、管道或套接字的原因,您将很幸运你的调试输出会去那里:)

关于visual-studio-2005 - Windows 8 上的 FreeConsole 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12676312/

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