【问题标题】:why doesn't winmain set the errorlevel?为什么 winmain 不设置错误级别?
【发布时间】:2010-10-10 04:13:10
【问题描述】:

为什么这个程序能正确显示消息框,却没有设置错误级别?

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 问题,因为我还从另一个应用程序启动了该进程并使用了 CreateProcess/WaitForSingleObject/GetExitCodeProcess

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


【解决方案1】:

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

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

start /wait a.exe
echo %ERRORLEVEL%

【讨论】:

  • 感谢作品。我在 CreateProcess 返回 0 时遇到的问题与当前工作目录有关。
【解决方案2】:

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

尝试做:

echo %CMDEXTVERSION%

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

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

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

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

【讨论】:

  • 哦...我认为 jdigital 已经解决了真正的问题。
猜你喜欢
  • 1970-01-01
  • 2016-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多