为什么写入标准输出时WriteFile会崩溃?

时间:2011-11-19 16:51:09

标签: windows crash stdout writefile

这是一个使用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。”

这里发生了什么?谢谢!

2 个答案:

答案 0 :(得分:17)

WriteFile is not optional的第四个参数。您正在传递NULL,这是不允许的。

答案 1 :(得分:0)

第4个参数(它告诉我们实际写入了多少字节)当你向该参数传递NULL时它期望指向DWORD值(也就是unsigned int)它尝试将DWORD写入空指针导致异常,不仅是必须将指针传递给该参数,而且你应该总是在写入后检查它的值,因为尽管很小,WriteFile会写出比你提供的数据少的数据。