exe文件无效时CreateProcess等待
Posted
技术标签:
【中文标题】exe文件无效时CreateProcess等待【英文标题】:CreateProcess waits when exe file is invalid 【发布时间】:2015-11-19 11:19:12 【问题描述】:我想制作一个简单的 C++ 程序,它使用CreateProcess 一次运行多个 exe 文件。如果 exe 文件无效(填充随机数据),则会出现一个消息框,并指出该文件与 64 位 Windows 不兼容,这很好,但我的程序一直等到消息框关闭。有没有办法绕过这个?
【问题讨论】:
【参考方案1】:您需要通过调用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);
【讨论】:
谢谢,它有效!但是我们不能直接调用 GetErrorMode 来获取 oldMode 吗? 如果您以 Vista 及更高版本为目标,则可以。 在 Windows 7 上,打开下载的可执行文件的安全警告也会暂停程序。有没有办法解决这个问题(我现在正在使用 ShellExecute,如果这不同的话)? 您可以删除表明该文件是从外部源下载的备用文件流。 请注意Win7+也有SetThreadErrorMode()
。是的,您应该在启动时调用SetErrorMode()
以禁用进程范围内的错误对话框。但让我们面对现实吧,有多少人实际上会这样做?有多少人甚至意识到Set(Thread)ErrorMode()
甚至存在?您也可以使用SetThreadErrorMode()
仅将调用CreateProcess()
的线程(如果与主线程不同)配置为一种解决方法,而不改变整个应用程序的行为。以上是关于exe文件无效时CreateProcess等待的主要内容,如果未能解决你的问题,请参考以下文章
gcc找不到-lgcc,g ++。exe:错误:CreateProcess:没有这样的文件或目录
x86_64-w64-mingw32-gcc.exe:错误:CreateProcess:没有这样的文件或目录
cmd.exe 在使用 CreateProcess 调用后立即关闭
Cannot run program “git.exe”: createprocess error=2,系统找不到指定的文件