¿Por qué se bloquea WriteFile al escribir en la salida estándar?

Aquí hay un programa "Hello world" que utiliza el archivo de escritura de WinAPI (compilado en Microsoft Visual C ++ 2008 Express):

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;
}

Si se ejecuta en una ventana de consola, felizmente saluda al mundo. Sin embargo, si intenta redirigir su salida estándar, como en

hello.exe > output.txt

el programa se bloquea en WriteFile (excepción de puntero NULL). No obstante, output.txt existe y contiene la salida correcta en su totalidad.

La pila de llamadas en caso de fallo:

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++

El mensaje: "Excepción no controlada en 0x75ce85ea (KernelBase.dll) en srgprc2.exe: 0xC0000005: Ubicación de escritura de infracción de acceso 0x00000000".

¿Que está pasando aqui? ¡Gracias

Respuestas a la pregunta(2)

Su respuesta a la pregunta