2009-02-26 6 views
6

¿Por qué este programa muestra correctamente un cuadro de mensaje, pero no establece el nivel de error?¿por qué winmain 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 al nombre de un 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 me devuelve 0. Hice una comprobación de errores para asegurarme de que todo comenzó correctamente.

Originalmente vi este problema en un programa más complejo, así que hice este sencillo programa para verificar el problema. Los resultados son los mismos, ambos programas que tienen WinMain siempre devuelven 0.

Intenté las opciones de compilación x64, x86 y Unicode y MBCS. Todos dan 0 como un código de nivel/estado de error.

+0

probado con winegcc y devuelve 90 (probado con $?) en mi sistema. tal vez algún problema con el caparazón? –

+0

Estoy usando MSVC++ 2005 –

+0

No creo que sea un problema de shell porque también inicié el proceso desde otra aplicación y utilicé CreateProcess/WaitForSingleObject/GetExitCodeProcess –

Respuesta

14

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 presionar OK, eche un vistazo a la ventana de comandos y verá que está listo para el siguiente comando).

Si este es el caso, crear su aplicación como aplicación del 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% 
+0

Gracias. El problema que estaba teniendo con CreateProcess que devuelve 0 era uno diferente relacionado con el directorio de trabajo actual. –

2

Para %ERRORLEVEL% para trabajar, tiene que tener extensiones de comando habilitadas (que creo que es la predeterminada ya que Dios sabe cuándo).

trate de hacer:

echo %CMDEXTVERSION% 

Para ver si están habilitadas extensiones. Obtengo '2' cuando están encendidos y "%CMDEXTVERSION%" cuando están apagados.

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

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

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

+1

Oh ... Creo que jdigital ha golpeado el problema real en la cabeza. –

+0

yup gracias por la información útil, aunque –

Cuestiones relacionadas