繁体   English   中英

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

[英]Under what circumstances does Internet Explorer fail to properly unload an ActiveX control?

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

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

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

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

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

我用 IE 6 进行了大部分测试,但我也看到 IE 7 上也出现了问题。 我还没有测试过 IE 8。

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

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

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

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

If there is a bug in IE, the trick would be to figure out what causes the bug to appear, and what you can do to trick IE into releasing your COM object properly (like, making the HTML go away).

另一种方法 - 将清理代码添加到您的DllMain function (添加 function 如果它不存在)。 然后不管引用计数(和引用计数错误),当你的 DLL 被卸载时,你可以清理自己:

BOOL WINAPI DllMain(HINSTANCE, DWORD dwReason, LPVOID) {
    if (dwReason == DLL_PROCESS_DETACH) {
        CleanUpAnyObjectsStillAlive();
    }
}

哦,还有一点警告 - 不要花太长时间进行清理 - 如果你这样做了,我不能 promise 进程关闭无论如何都不会杀死你。

我有同样的问题,但只在特定的计算机上。 这台计算机的 Flash ActiveX 也有问题,关闭选项卡后它仍然存在。 我的猜测是问题不在于您的代码。 其他电脑有这个问题吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM