почему winmain не устанавливает уровень ошибки? - PullRequest
6 голосов
/ 26 февраля 2009

Почему эта программа правильно отображает окно сообщения, но не устанавливает уровень ошибки?

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;
}

Я скомпилировал приведенный выше код с именем исполняемого файла a.exe. Я сделал это в командной строке:

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

Я получаю те же результаты, если использую exit(90); прямо перед возвратом. Это все еще говорит 0.

Я также пытался запустить программу с помощью CreateProcess и получить результат с помощью GetExitCodeProcess, но он также возвращает 0 мне. Я сделал проверку ошибок, чтобы убедиться, что все было запущено правильно.

Первоначально я видел эту проблему в более сложной программе, поэтому я создал эту простую программу для проверки проблемы. Результаты одинаковы, обе программы, которые имеют WinMain, всегда возвращают 0.

Я попробовал оба варианта компиляции x64, x86 и unicode и MBCS. Все дают 0 в качестве уровня ошибки / кода состояния.

Ответы [ 2 ]

14 голосов
/ 26 февраля 2009

Если ваша программа является приложением Windows, а не консольным приложением, интерпретатор команд не ожидает его завершения (прежде чем нажать OK, взгляните на окно команд, и вы увидите, что оно готово к следующая команда).

Если это так, то создание приложения в виде консольной подсистемы решит проблему. Если вам нужно запустить приложение под Windows, вы можете подождать, пока команда завершится, и посмотреть, сработает ли это (я не пробовал, но это кажется хорошим подходом):

start /wait a.exe
echo %ERRORLEVEL%
2 голосов
/ 26 февраля 2009

Чтобы %ERRORLEVEL% работал, у вас должны быть включены расширения команд (которые, я думаю, используются по умолчанию, поскольку Бог знает, когда).

Попробуйте сделать:

echo %CMDEXTVERSION%

Чтобы увидеть, включены ли расширения. Я получаю вывод 2, когда они включены, и %CMDEXTVERSION%, когда они выключены.

Вы также можете проверить уровень ошибки, используя старый стиль:

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

Это должно работать независимо от расширений или если кто-то установил переменную окружения с именем "ERRORLEVEL"

...