gpt4 book ai didi

c++ - 什么情况下 Internet Explorer 无法正确卸载 ActiveX 控件?

转载 作者:行者123 更新时间:2023-11-30 03:12:51 25 4
gpt4 key购买 nike

我在编写 ActiveX 控件时遇到了一个令人费解的问题 - 有时,Internet Explorer 似乎无法在进程关闭时正确卸载控件。这导致控件实例的析构函数未被调用。

该控件是用 C++ 编写的,使用 ATL 并使用 Visual Studio 2005 编译。当用户离开控件嵌入的页面时,总是会调用控件实例的析构函数 - 只有在浏览器关闭时才会出现此问题.

当我在调试器下运行 IE 时,我没有看到任何异常 - 调试器没有捕获任何异常、访问冲突或断言失败,但问题仍然存在 - 我可以在控件的析构函数中设置断点当我关闭浏览器时它永远不会被击中。

此外,当我加载一个嵌入多个控件实例的简单 HTML 页面时,我没有发现问题。只有当控件从我们的 Web 应用程序实例化时才会出现问题,该应用程序将标签动态插入网页 - 当然,不知道是什么导致了这个问题,我不知道这些信息是否相关,但它似乎确实表明这可能是一个 IE 问题,因为它依赖于数据。

当我在调试器下运行简单的测试用例时,我可以在控件的析构函数中设置一个断点,并且每次都会命中。我相信这排除了控件本身的问题(例如,会阻止析构函数被调用的错误,例如接口(interface)泄漏。)

我的大部分测试都是使用 IE 6 进行的,但我也发现该问题也发生在 IE 7 上。我还没有测试过 IE 8。

我现在的工作假设是动态 HTML 代码中有某些东西导致浏览器泄漏 ActiveX 控件上的接口(interface)。到目前为止,我还没有能够生成一个好的测试用例来在应用程序之外重现这个,而且应用程序有点太大而无法制作一个好的测试用例。

我希望有人能够深入了解可能导致此类行为的已知 IE 错误。顺便说一下,下面提供的答案太笼统了——我正在寻找已知会导致这种情况的一组特定情况。肯定有人以前见过这个。

最佳答案

要使用 C++ 调试 COM 中未调用对象 (C++) 析构函数的问题,最好的方法是关注 COM 对象的引用计数是如何递增或递减的。可能发生的情况是有人将引用计数增加了太多次,然后没有减少相同的次数。这会导致对象未被释放。

您的动态 HTML 可能只是在 IE 中显示错误,如果您使用静态页面则不会发生这种情况。

如果 IE 中存在错误,诀窍就是找出导致错误出现的原因,以及您可以采取什么措施来欺骗 IE 正确释放您的 COM 对象(例如,让 HTML 消失)。

关于c++ - 什么情况下 Internet Explorer 无法正确卸载 ActiveX 控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65133/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com