我正在将第三方基于C的SDK集成到我的.NET应用程序中。该应用程序将作为服务器上的Windows服务运行,因此它不应以任何方式与用户交互。
不幸的是,在某些错误情况下,它坚持调用MessageBoxA,可能是为了报告发生了一些不好的事情。发生这种情况时,服务停止响应。我猜它正等着有人按Ok?
供应商无法为我更改代码。
有没有办法让这个调用成为无操作,所以我的代码可以自动处理这种情况?
编辑:可能很重要的是,在我的特定情况下,如果服务崩溃,服务将自动重启。对于在我的情况下显示MessageBox的情况,优雅(尽可能)和突然退出可能是最佳解决方案。
答案 0 :(得分:10)
结帐Detours from Microsoft Research。它允许您绕过任意Windows API函数。需要C / C ++编程才能使其工作。你不需要太多。
答案 1 :(得分:3)
您可以使用编辑器查找此位置并从其二进制文件中删除该调用。但根据软件的使用限制,这可能允许也可能不允许。当然,如果您重新分发它可能会导致问题 - 您应该询问供应商并将其报告为缺陷,并建议您有自己使用的解决方法。
对于曾经做过这种事情的人(破解许可证或其他逆向工程),这非常简单,但真正的问题是,如果被忽略会发生什么 - 它是否仍然继续有用?
答案 2 :(得分:0)
这不是很容易。我认为唯一的方法是编写一个消息钩子来捕获泵送到系统上所有Windows消息循环的消息。但我甚至不确定服务是否可以创建消息挂钩,因为它无法访问默认凭据(LocalSystem)下的默认窗口站。所以第一个任务就是看看它是否真的有效。
但这里有一个粗略的草图,我将如何尝试在服务上下文之外进行,你可以看看它是否适用:
这对你来说是非常冒险的,但它似乎对我有任何机会。