Pregunta

¿Por qué este programa se muestra correctamente un cuadro de mensaje, pero no establece el nivel de error?

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
  MessageBox(NULL, _T("This should return 90 no?"), _T("OK"), MB_OK);
  return 90;
}

He compilado el código anterior para el nombre de un archivo ejecutable llamado a.exe. La hice esto en símbolo del sistema:

c:\> a.exe 
 (message box is displayed, I press ok)
c:\> echo %ERRORLEVEL% 
  0

consigo los mismos resultados si uso exit(90); justo antes de la devolución. Todavía dice 0.

También traté de iniciar el programa a través de CreateProcess y obtener el resultado con GetExitCodeProcess pero también devuelve 0 a mí. Hice la comprobación de errores para asegurarse de que estaba todo comenzó correctamente.

vi originalmente este problema en un programa más complejo por lo que hizo este sencillo programa para verificar el problema. Los resultados son los mismos, tanto en los programas que han WinMain siempre vuelven 0.

He intentado tanto x64, x86 y Unicode y MBCS opciones de compilación. Todos dan 0 como un código de nivel / estado de error.

¿Fue útil?

Solución

Si su programa es una aplicación de Windows, en lugar de una aplicación de consola, el intérprete de comandos no espera a que se complete (antes de pulsar Aceptar, echar un vistazo a la ventana de comandos y verá que está listo para el siguiente comando).

Si este es el caso, la construcción de su aplicación como aplicación de subsistema de consola resolvería el problema. Si es necesario ejecutar como una aplicación de Windows, es posible tratar de esperar a que se complete el comando y ver si funciona (no he probado esto, pero parece que un buen enfoque):

start /wait a.exe
echo %ERRORLEVEL%

Otros consejos

Para %ERRORLEVEL% a trabajar hay que tener habilitadas las extensiones de comando (que creo que es el valor por defecto ya que Dios sabe cuándo).

Trate de hacer:

echo %CMDEXTVERSION%

Para ver si están habilitadas extensiones. Recibo el mensaje '2' de salida cuando están en y "%CMDEXTVERSION%" cuando están fuera.

También puede probar el nivel de error utilizando el viejo estilo:

if errorlevel 1 echo errorlevel is 1 or more...

Eso debería funcionar independientemente de las extensiones o si alguien ha establecer una variable de entorno con el nombre "ERRORLEVEL"

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top