Oto program "Hello World", który wykorzystuje WINAPI za WriteFile (skompilowany w programie Microsoft Visual C++ 2008 Express):Dlaczego WriteFile ulega awarii podczas zapisu na standardowe wyjście?
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;
}
Jeśli wykonywane w oknie konsoli, to radośnie wita świat. Jeśli próbujesz przekierować standardowe wyjście, jednak, jak w
wypadkówhello.exe > output.txt
programu w WriteFile (null pointer wyjątków). Mimo to plik output.txt istnieje i zawiera poprawne dane wyjściowe w całości.
Wezwanie stos o katastrofie:
[email protected]() + 0x75 bytes
[email protected]() + 0x4e bytes
srgprc2.exe!wmain(int argc=1, wchar_t * * argv=0x00483d88) Line 15 + 0x16 bytes C++
komunikat: "wyjątek Unhandled na 0x75ce85ea (KernelBase.dll) w srgprc2.exe: 0xC0000005. Naruszenie zasad dostępu lokalizacja pisanie 0x00000000"
Co tu się dzieje? Dzięki!
Usuń wywołanie CloseHandle(). –
... tak jak powinno być jasne, ponieważ używasz funkcji 'Get ...', a nie 'Open ...'. –
The CloseHandle nie jest nawet wywoływana, awaria odbywa się w WriteFile i program się kończy. – user38329