下面是一个使用WinAPI的的WriteFile的一个 “Hello World” 程序(编译在Microsoft Visual C++ 2008年速成):为什么WriteFile在写入标准输出时崩溃?
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存在并且包含完整的正确输出。
上崩溃的调用堆栈:
[email protected]() + 0x75 bytes
[email protected]() + 0x4e bytes
srgprc2.exe!wmain(int argc=1, wchar_t * * argv=0x00483d88) Line 15 + 0x16 bytes C++
消息: “访问冲突写入位置00000000未处理的异常在0x75ce85ea(KernelBase.dll)在srgprc2.exe:0000005。”
这是怎么回事吗?谢谢!
删除CloseHandle()调用。 –
...应该清楚,因为您正在使用“Get ...”功能,而不是“Open ...”功能。 –
CloseHandle甚至没有调用,崩溃发生在WriteFile中,程序终止。 – user38329