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.

Foi útil?

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"

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top