【发布时间】:2015-11-19 11:19:12
【问题描述】:
我想制作一个简单的 C++ 程序,它使用CreateProcess 一次运行多个 exe 文件。如果 exe 文件无效(填充随机数据),则会出现一个消息框,并指出该文件与 64 位 Windows 不兼容,这很好,但我的程序一直等到消息框关闭。有没有办法绕过这个?
【问题讨论】:
标签: c++ windows winapi createprocess
我想制作一个简单的 C++ 程序,它使用CreateProcess 一次运行多个 exe 文件。如果 exe 文件无效(填充随机数据),则会出现一个消息框,并指出该文件与 64 位 Windows 不兼容,这很好,但我的程序一直等到消息框关闭。有没有办法绕过这个?
【问题讨论】:
标签: c++ windows winapi createprocess
您需要通过调用SetErrorMode 更改您的进程的错误处理策略。您应该在程序的最开始,即启动期间执行此操作。
SetErrorMode(SetErrorMode(0) | SEM_NOGPFAULTERRORBOX | SEM_FAILCRITICALERRORS
| SEM_NOOPENFILEERRORBOX);
我相信SEM_FAILCRITICALERRORS 是与您当前问题相关的标志,但您也应该包括其他标志。
请注意,至少在旧版本的 Windows 中,没有简单地获取当前错误模式的功能。在 Vista 中添加了GetErrorMode 函数。因此,我们改为调用SetErrorMode(0),它返回之前的错误模式。 Raymond Chen 的文章在这里讨论了这种有点不方便的 API 设计:Disabling the program crash dialog。当然,如果你不再支持 XP,你可以使用:
SetErrorMode(GetErrorMode() | SEM_NOGPFAULTERRORBOX | SEM_FAILCRITICALERRORS
| SEM_NOOPENFILEERRORBOX);
【讨论】:
SetThreadErrorMode()。是的,您应该在启动时调用SetErrorMode() 以禁用进程范围内的错误对话框。但让我们面对现实吧,有多少人实际上会这样做?有多少人甚至意识到Set(Thread)ErrorMode() 甚至存在?您也可以使用SetThreadErrorMode() 仅将调用CreateProcess() 的线程(如果与主线程不同)配置为一种解决方法,而不改变整个应用程序的行为。