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