【问题标题】:How can I prevent a third party library from displaying a MessageBox?如何防止第三方库显示 MessageBox?
【发布时间】:2010-02-01 20:04:17
【问题描述】:

我正在将第三方基于 C 的 SDK 集成到我的 .NET 应用程序中。该应用程序将作为 Windows 服务在服务器上运行,因此它不应以任何方式与用户交互。

不幸的是,在某些错误情况下,它坚持调用 MessageBoxA,大概是为了报告发生了不好的事情。发生这种情况时,服务将停止响应。我猜是在等人按确定?

不可能让供应商为我更改他们的代码。

有没有办法可以将此调用变为无操作,以便我的代码可以自动处理这种情况?

编辑:可能很重要的一点是,在我的特定情况下,如果服务崩溃,它会自动重启。对于在我的情况下显示 MessageBox 的情况,优雅(尽可能)和突然退出可能是最佳解决方案。

【问题讨论】:

  • 我知道这不是一个真正的答案,但找到一个更好的图书馆/服务。如果图书馆有这类问题,它可能会有更多问题。
  • 我记得我的一个白痴前同事在一个消息框中输入了一个已知是服务的代码。我告诉他删除它,但他仍然把它留在里面,我们不得不重新发布软件......不好。
  • 不,说它不是来自图书馆的 MessageBox!!!!好问题
  • 您可以使用一些技巧,例如生成一个线程来检查对话窗口并发送关闭消息,但正确的答案是 C. Ross 的:找到更好的 SDK。
  • @Steven - 在没有用户的情况下运行时你能可靠地做到这一点吗?在所有操作系统上?我不是说你不能——我只是不确定它是不是被切干了。

标签: .net winapi


【解决方案1】:

查看Detours from Microsoft Research。它允许您绕过任意 Windows API 函数。但是,需要 C/C++ 编程才能使其工作。你不需要太多。

【讨论】:

  • 哇,不知道你能做到。
  • @nobugz 你就像一个图书馆。说真的。
  • 我一直在这里和 MSDN 论坛上阅读 nobugz 的答案,我确信他是 Dave Cutler。
  • 有没有人知道获得 Detours 之类的许可有多难和/或多贵?
  • 你需要写一本书(如果你有请指点我),因为你是一个信息丰富的朋友!我的意思是我从你那里学会了如何读取十六进制转储 - 太疯狂了!
【解决方案2】:

您可以使用编辑器找到它的位置并从其二进制文件中删除调用。但根据软件的使用限制,这可能允许也可能不允许。当然,如果您重新分发它可能会导致问题 - 您应该询问供应商并将其报告为缺陷,并建议您有自己使用的解决方法。

对于曾经做这种事情(破解许可证或其他逆向工程)的人来说,这非常简单,但真正的问题是,如果忽略它会发生什么 - 它仍然继续有效吗?

【讨论】:

  • 在这种情况下崩溃是可以的。服务挂起这样的情况要糟糕得多。
  • 那么,如果您知道停止是可以的,您也可以退出进程并在未找到运行时使用其他看门狗将其恢复。如果可以的话,我会避免这种复杂性,只是看看你是否可以摆脱 NO-OPing 它。然后当然是分发/使用的法律问题?如果你不认识有能力的人,我认识一个曾经向我报告的人,他喜欢对二进制文件进行逆向工程。
  • 已经有一个看门狗——如果程序崩溃,它会自动重启。这就是为什么它挂起对我来说如此令人沮丧! :) 我也不知道法律问题。
  • 如果看门狗在服务无响应(但未崩溃)时重启服务怎么样?
【解决方案3】:

这并不容易。我认为唯一的方法是编写一个消息挂钩来捕获通过系统上所有 Windows 消息循环泵送的消息。但我什至不确定服务是否可以创建消息挂钩,因为它无法访问其默认凭据(LocalSystem)下的默认窗口站。所以第一项任务是看看这是否真的有效。

但这里是我将如何尝试在服务上下文之外执行此操作的粗略草图,您可以查看它是否适用:

  1. 创建一个windowshook来捕获来自系统上所有windows消息队列的消息。
  2. 捕获所有 WM_CREATE 消息,并探测 CREATESTRUCT 参数以查找可能来自您的第三方库的消息。您可能必须记录所有 WM_CREATE 消息,然后分析数据以了解如何将库的对话框与系统上的任何其他对话框区分开来。 (很多时候,“lpszName”成员在对话框实现之间是不同的。)
  3. 如果您认为特定的 WM_CREATE 来自您的库,请从您的消息挂钩返回“已处理”响应,并且不要调用链中的下一个消息处理程序。

请注意,这一切都很冒险,但这条路对我来说似乎有任何机会。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-31
    • 2013-01-04
    • 1970-01-01
    • 2015-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    相关资源
    最近更新 更多