为什么winmain不设置错误级别?

时间:2009-02-26 19:37:04

标签: c++ winapi visual-c++ winmain

为什么此程序正确显示消息框,但未设置错误级别?

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 个答案:

答案 0 :(得分:14)

如果您的程序是Windows应用程序而不是控制台应用程序,则命令解释程序不会等待它完成(在您按OK之前,请查看命令窗口,您将看到它已准备就绪下一个命令)。

如果是这种情况,将应用程序构建为控制台子系统应用程序可以解决问题。如果你需要作为一个Windows应用程序运行,你可能会尝试等待命令完成,看看是否有效(我没有尝试过,但这似乎是一个很好的方法):

start /wait a.exe
echo %ERRORLEVEL%

答案 1 :(得分:2)

要让%ERRORLEVEL%工作,你必须启用命令扩展(我认为这是默认的,因为上帝知道什么时候)。

尝试做:

echo %CMDEXTVERSION%

查看是否启用了扩展功能。打开时会显示“2”输出,而当它们关闭时会显示“%CMDEXTVERSION%”。

您还可以使用旧样式测试错误级别:

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

无论扩展名如何,或者有人设置名为“ERRORLEVEL”的环境变量

,这都应该有效