【问题标题】:What happens to an ActiveX control (COleControl) after the call to OnDestroy()?调用 OnDestroy() 后 ActiveX 控件 (COleControl) 会发生什么情况?
【发布时间】:2011-02-02 10:40:35
【问题描述】:

我有一个在 Internet Explorer 8 中运行的用 C++ 编写的 ActiveX 控件。大多数情况下(大约 90%)当包含该控件的选项卡或浏览器关闭时,会出现如下访问冲突:

The thread 'Win32 Thread' (0x1bf0) has exited with code 0 (0x0).
Unhandled exception at 0x77b3b9fd in iexplore.exe: 0xC0000005: Access violation reading location 0x65007408.

访问冲突发生在调用 OnDestroy() 之后但在调用控件的析构函数之前。

调试输出显示:

No symbols are loaded for any call stack frame. The source code cannot be displayed.

堆栈跟踪中不存在我的任何代码,尽管堆在执行过程中的某个较早时间点可能已损坏。

ActiveX 控件在调用 OnDestroy() 和控件的析构函数之间接收哪些生命周期事件?

【问题讨论】:

    标签: c++ activex access-violation object-lifetime


    【解决方案1】:

    据我了解,ActiveX 没有严格的事件生命周期,它取决于主机端。如果您的控件与某些 AJAX 框架一起使用,例如,在 OnDestroy() 之后可以调用 OnCreate() 而无需调用析构函数。因此,请确保您在 OnDestroy() 处理程序中没有取消初始化操作。

    您可以在 ActiveX 控件测试容器中加载控件并使用激活/停用进行操作,也许会有所帮助。

    debugging tools for windows 启用应用程序验证器并确保您的调试器downloads OS debug symbols。在这种情况下,堆栈跟踪将提供更多信息。

    【讨论】:

    • 非常感谢您的回答。关闭浏览器的问题似乎与在控件生命周期的早期控件准备好之前调用的 OnSetCursor() 事件处理程序有关。
    猜你喜欢
    • 2019-09-14
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多