【发布时间】:2012-01-01 23:53:29
【问题描述】:
这是一个使用 WinAPI 的 WriteFile(在 Microsoft Visual C++ 2008 Express 中编译)的“Hello world”程序:
int _tmain(int argc, _TCHAR* argv[])
{
wchar_t str[] = L"Hello world";
HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
if(out && out!=INVALID_HANDLE_VALUE)
{
WriteFile(out, str, sizeof(str), NULL, NULL);
CloseHandle(out);
}
return 0;
}
如果在控制台窗口中执行,它会愉快地迎接世界。但是,如果您尝试重定向其标准输出,如
hello.exe > output.txt
程序在 WriteFile 中崩溃(NULL 指针异常)。尽管如此,output.txt 仍然存在并包含完整的正确输出。
崩溃时的调用栈:
KernelBase.dll!_WriteFile@20() + 0x75 bytes
kernel32.dll!_WriteFileImplementation@20() + 0x4e bytes
srgprc2.exe!wmain(int argc=1, wchar_t * * argv=0x00483d88) Line 15 + 0x16 bytes C++
消息:“srgprc2.exe 中 0x75ce85ea (KernelBase.dll) 处的未处理异常:0xC0000005:访问冲突写入位置 0x00000000。”
这里发生了什么?谢谢!
【问题讨论】:
-
删除 CloseHandle() 调用。
-
... 应该清楚,因为您使用的是
Get...函数,而不是Open...函数。 -
CloseHandle 甚至没有被调用,崩溃发生在 WriteFile 并且程序终止。
-
尝试复制句柄而不是获取它。另外,也许你得到了没有附加到任何东西的标准输出流,因为输出被重定向了?深入了解控制台进程的 I/O 重定向...
-
既然 output.txt 生成正确,问题不在于悬空句柄...
标签: windows crash stdout writefile