por que não winmain definir o errorlevel?
-
09-09-2019 - |
Pergunta
Por que este programa exibe corretamente uma caixa de mensagem, mas não define o nível de erro?
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;
}
Eu compilei o código acima para o nome de um chamado a.exe executável. O que eu fiz isso no prompt de comando:
c:\> a.exe
(message box is displayed, I press ok)
c:\> echo %ERRORLEVEL%
0
Eu obter os mesmos resultados se eu usar direito exit(90);
antes do retorno. Ele ainda diz 0
.
Eu também tentou iniciar o programa através CreateProcess
e obter o resultado com GetExitCodeProcess
mas também retorna 0
para mim. Eu fiz a verificação de erros para garantir que foi tudo começou corretamente.
Inicialmente eu vi esse problema em um programa mais complexo por isso fiz esse programa simples para verificar o problema. Os resultados são os mesmos, ambos os programas que têm WinMain
sempre voltar 0
.
Eu tentei tanto x64, x86 e Unicode e MBCS opções de compilação. Todos 0
dar como um código de nível / status de erro.
Solução
Se seu programa é um aplicativo do Windows, em vez de um aplicativo Console, o interpretador de comandos não esperar por ele para completar (antes de pressionar OK, dê uma olhada na janela de comando e você verá que ele está pronto para o próximo comando).
Se este for o caso, a construção de seu aplicativo como aplicativo Console subsistema resolveria o problema. Se você precisa para ser executado como um aplicativo do Windows, você pode tentar esperar para que o comando completo e ver se isso funciona (eu não tentei isso, mas parece ser uma abordagem bom):
start /wait a.exe
echo %ERRORLEVEL%
Outras dicas
Para %ERRORLEVEL%
a trabalhar você tem que ter as extensões de comando habilitado (o que eu acho que é o padrão, já que Deus sabe quando).
Tente fazer:
echo %CMDEXTVERSION%
Para ver se extentions estão habilitados. I obter uma saída '2
' quando estão em e "%CMDEXTVERSION%
" quando eles estão desligados.
Você também pode testar o nível de erro usando o velho estilo:
if errorlevel 1 echo errorlevel is 1 or more...
Isso deve funcionar independentemente de extensões ou se alguém definir uma variável de ambiente com o nome "ERRORLEVEL
"