为什么WinMain不设置ErrorLevel?

7

为什么这个程序可以正确显示消息框,但是不能设置错误级别?

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作为错误级别/状态代码。

使用winegcc测试后,在我的系统上返回90(使用$?进行测试)。可能是一些shell问题? - Johannes Schaub - litb
我不认为这是一个shell问题,因为我还从另一个应用程序启动了该进程,并使用了CreateProcess/WaitForSingleObject/GetExitCodeProcess。 - Brian R. Bondy
2个回答

16

如果你的程序是一个Windows应用程序,而不是控制台应用程序,命令解释器不会等待它完成(在你按下“确定”之前,看一下命令窗口,你会发现它已经准备好了下一个命令)。

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

start /wait a.exe
echo %ERRORLEVEL%

感谢您的帮助,我的问题已经解决了。在使用CreateProcess函数时,返回值为0的问题与当前工作目录有关。 - Brian R. Bondy

2
< p >要使用%ERRORLEVEL%,您需要启用命令扩展(我认为这是默认设置,从上帝知道什么时候开始)。

尝试执行:

echo %CMDEXTVERSION%

要查看是否启用了扩展。当它们启用时,我会得到“2”的输出,而当它们未启用时则是“%CMDEXTVERSION%”。
您还可以使用旧式方法测试错误级别:
if errorlevel 1 echo errorlevel is 1 or more...

无论是否使用扩展名或者某人是否设置了名为"ERRORLEVEL"的环境变量,这应该都起作用。


1
哦...我认为jdigital已经抓住了实际问题的关键。 - Michael Burr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接