我正在编写的 ActiveX 控件遇到了一个令人困惑的问题 - 有时,Internet Explorer 似乎无法在进程关闭时正确卸载控件。这导致不调用控件实例的析构函数。
该控件是用 C++ 编写的,使用 ATL 并使用 Visual Studio 2005 编译。当用户浏览远离嵌入控件的页面时,始终调用控件实例的析构函数 - 只有在关闭浏览器时才会出现问题。
当我在调试器下运行 IE 时,我没有看到任何异常 - 调试器没有捕获任何异常、访问冲突或断言失败,但问题仍然存在 - 我可以在控件的析构函数中设置断点,它永远不会当我关闭浏览器时点击。
此外,当我加载一个嵌入多个控件实例的简单 HTML 页面时,我看不到问题。该问题仅在从我们的 Web 应用程序实例化控件时才会出现,该应用程序将标签动态插入到网页中 - 当然,不知道是什么导致了这个问题,我不知道这部分信息是否相关,但它似乎表明这可能是一个 IE 问题,因为它依赖于数据。
当我在调试器下运行简单的测试用例时,我可以在控件的析构函数中设置一个断点,并且每次都会命中它。我相信这排除了控件本身的问题(例如,会阻止调用析构函数的错误,例如接口泄漏。)
我使用 IE 6 进行了大部分测试,但我也看到 IE 7 上也出现了问题。我还没有测试过 IE 8。
我现在的工作假设是动态 HTML 代码中的某些内容会导致浏览器泄漏 ActiveX 控件上的界面。到目前为止,我还没有能够在应用程序之外生成一个好的测试用例来重现这个,而且应用程序有点太大而无法制作一个好的测试用例。
我希望有人能够深入了解可能导致这种行为的 IE 错误。顺便说一句,下面提供的答案太笼统了——我正在寻找一组已知会导致这种情况的特定情况。肯定有人以前见过这个。