Ecco un programma "Ciao mondo" che utilizza WriteFile di WinAPI (compilato in Microsoft Visual C++ 2008 Express):Perché WriteFile si arresta in modo anomalo durante la scrittura sullo standard output?
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;
}
Se eseguito in una finestra di console, si saluta felicemente il mondo. Se si tenta di reindirizzare il suo standard di uscita, tuttavia, come in
crashhello.exe > output.txt
il programma in WriteFile (NULL pointer eccezione). Tuttavia, output.txt esiste e contiene l'output corretto nella sua interezza.
La chiamata pila su incidente:
[email protected]() + 0x75 bytes
[email protected]() + 0x4e bytes
srgprc2.exe!wmain(int argc=1, wchar_t * * argv=0x00483d88) Line 15 + 0x16 bytes C++
Il messaggio: "L'eccezione non gestita in 0x75ce85ea (KernelBase.dll) in srgprc2.exe: 0xC0000005:. Violazione di accesso scrittura posizione 0x00000000"
Cosa sta succedendo qui? Grazie!
Rimuovere la chiamata CloseHandle(). –
... come dovrebbe essere chiaro, dal momento che stai usando una funzione 'Get ...', non una funzione 'Apri ...'. –
CloseHandle non viene nemmeno chiamato, l'arresto si verifica in WriteFile e il programma termina. – user38329