He aquí un programa "Hola mundo" que utiliza escritura de archivo de API de Windows (compilado en Microsoft Visual C++ 2008 Express):¿Por qué falla WriteFile al escribir en la salida estándar?
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 la consola, que felizmente saluda el mundo. Si intenta redirigir la salida estándar, sin embargo, como en
accidenteshello.exe > output.txt
el programa de escritura de archivo (excepción de puntero nulo). No obstante, output.txt existe y contiene la salida correcta en su totalidad.
La llamada pila de accidente:
[email protected]() + 0x75 bytes
[email protected]() + 0x4e bytes
srgprc2.exe!wmain(int argc=1, wchar_t * * argv=0x00483d88) Line 15 + 0x16 bytes C++
El mensaje: "violación de acceso de localización de escritura 0x00000000 excepción no controlada en 0x75ce85ea (KernelBase.dll) en srgprc2.exe:: 0xc0000005".
¿Qué está pasando aquí? ¡Gracias!
Elimina la llamada CloseHandle(). –
... como debe ser claro, ya que está utilizando una función 'Get ...', no una función 'Open ...'. –
CloseHandle ni siquiera se llama, el bloqueo ocurre en WriteFile y el programa finaliza. – user38329