【问题标题】:SetErrorMode has no effect?SetErrorMode 没有效果?
【发布时间】:2011-10-01 04:33:15
【问题描述】:

我打电话

"SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);"

在加载 DLL 之前。尽管如此,还是会弹出一条窗口消息

"此应用程序启动失败 因为没有找到blabla.dll...”。

为什么会这样?我认为这就是 SetErrorMode 应该防止的? 谢谢!

【问题讨论】:

    标签: windows winapi windows-xp messagebox


    【解决方案1】:

    SetErrorMode 的调用可能永远不会执行 - 如果您静态链接到 DLL,它将与可执行文件一起加载。您看到的消息是由操作系统弹出的,而不是您的代码。如果你想控制 DLL 的加载,你应该使用 LoadLibrary 加载它 - 但是使用导出的函数有点困难。

    您可以创建自己的加载程序(不同的可执行文件),这将确保所有 DLL 都可用,然后运行主可执行文件。但这可能有点矫枉过正......

    【讨论】:

    • 嗯,我觉得这里有点误会。抱歉没有更清楚。实际上,DLL 是通过 LoadLibrary 加载的。并且 SetErrorMode 之前以 100% 的确定性执行。但是然后加载另一个 DLL(由我加载的 DLL 使用)失败...
    • 是否有可能设置错误模式被以前执行的代码以某种方式禁用?例如。错误模式之前已由应用程序的另一部分设置,现在我无法将其设置为不同的模式?
    • @Hans,这可能是正在发生的事情。通常,SetErrorMode 会成功抑制 LoadLibrary 错误通知。尝试在失败后立即调用GetErrorMode,看看它的当前值是多少。如果它改变了,那就是你的问题。如果您开发 DLL,要学习的一课 - 始终考虑以前有人调用过 SetErrorMode 的可能性,并考虑根据您的需要屏蔽现有值...如果是这种情况,您可能必须手动检查所需的存在LoadLibrary 之前的 DLL。
    • 嗯,好像错误模式设置正确了。在加载 DLL 之前和之后设置所有标志。所以问题一定出在其他地方……还有什么想法吗?谢谢:-)
    • @Hans,有人可能仍在加载的 DLL 中设置错误模式,然后在它返回到您的代码之前将其恢复。另一种选择是 DLL 正在启动一个新进程,这是消息的实际来源(错误模式是每个进程)。您可以使用 ProcExp 识别后者(检查消息何时弹出)。要识别前者,您需要做一些黑客攻击 - 挂钩 SetErrorMode,找出模式值存储在内存中的位置。它不会很漂亮......
    猜你喜欢
    • 2012-10-30
    • 2018-05-21
    • 2018-07-28
    • 2018-05-15
    • 1970-01-01
    • 2015-05-31
    • 2020-10-19
    • 2014-04-19
    • 1970-01-01
    相关资源
    最近更新 更多