Winapi 将STD_OUTPUT_HANDLE直接作为输入句柄传递给WriteFile合法吗?

Winapi 将STD_OUTPUT_HANDLE直接作为输入句柄传递给WriteFile合法吗?,winapi,writefile,Winapi,Writefile,WinApiWriteFile()函数似乎直接接受STD\u xxx\u HANDLE常量作为第一个参数。我执行了以下命令: #include <windows.h> main() { DWORD bw; WriteFile( (void *)STD_OUTPUT_HANDLE, "output", 6, &bw, NULL); WriteFile( GetStdHandle(STD_OUTPUT_HANDLE), "output", 6

WinApi
WriteFile()
函数似乎直接接受
STD\u xxx\u HANDLE
常量作为第一个参数。我执行了以下命令:

#include <windows.h>
main() {
    DWORD bw;

    WriteFile( (void *)STD_OUTPUT_HANDLE,       "output", 6, &bw, NULL);
    WriteFile( GetStdHandle(STD_OUTPUT_HANDLE), "output", 6, &bw, NULL);

    WriteFile( (void *)STD_ERROR_HANDLE,        "error", 5, &bw, NULL);
    WriteFile( GetStdHandle(STD_ERROR_HANDLE),  "error", 6, &bw, NULL);
}
#包括
main(){
德沃德;
WriteFile((void*)标准输出句柄,“OUTPUT”,6,&bw,NULL);
WriteFile(GetStdHandle(标准输出句柄),“输出”,6,&bw,NULL);
WriteFile((void*)STD_ERROR_HANDLE,“ERROR”,5,&bw,NULL);
WriteFile(GetStdHandle(STD\u ERROR\u HANDLE),“ERROR”,6,&bw,NULL);
}
上面的示例将“输出”两次写入标准输出,将“错误”两次写入标准输出。我已经在Win XP和Win 7上进行了测试(我无法使用WINE或Win 10)

我可以看到
GetStdHandle()
确实转换了值(在
STD\u输出\u句柄
的情况下从-11转换为7),但这两个值的工作原理与
WriteFile()的工作原理相同

当WriteFile将
STD\u xxx\u句柄
常量识别为其
句柄
输入时,它是否隐式执行
GetStdHandle()
?我已经看过了,但是找不到这个文档


是的,我知道如果没有记录,不要做。。。我只是想知道我是否遗漏了什么。

需要一个句柄。
STD\u xxx\u句柄
值不是句柄。将这些值传递给
WriteFile
是不合法的。您必须通过调用将它们转换为句柄。

令人惊讶的是,即使在Windows95RTM和NT4(以及XP和8)上,这也能正常工作,所以这似乎是故意的。我无法告诉你为什么,也无法告诉你,在NT3.x中,这种情况会持续多久


但是它没有文档记录,也不是ABI的一部分,所以我建议您继续调用
GetStdHandle
,以避免将来出现令人不快的意外情况。

是,
WriteFile
check
hFile
对于
STD\u错误处理,STD\u输出\u处理,STD_INPUT_HANDLE
并使用
GetStdHandle
对其进行转换,我猜这是为了支持某些自动源代码重写工具而添加的。。。现在为了保持向后兼容性而永远保留,实际上,纠结于此是没有意义的。它在其他API中被认为是无效的句柄:)感谢您的额外研究。我已经清醒过来,将继续虔诚地执行
GetStdHandle()
映射,尽管这可能是不必要的。