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

4

2 回答 2

15

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

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

start /wait a.exe
echo %ERRORLEVEL%
于 2009-02-26T19:56:10.287 回答
2

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

尝试做:

echo %CMDEXTVERSION%

查看是否启用了扩展。当它们打开时我得到“ 2”输出,%CMDEXTVERSION%当它们关闭时我得到“”输出。

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

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

无论扩展如何,或者是否有人设置了名为“ ERRORLEVEL”的环境变量,这都应该有效

于 2009-02-26T19:59:44.647 回答