下面是一個使用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