首页 > 解决方案 > 内存未释放 - MFC 应用程序中使用的 ActiveX 控件 (.NET/C#)

问题描述

我的 COM/OLE/ActiveX 组件存在内存问题。但我只知道 ActiveX 的基础知识……我在这里联系 ActiveX 专家 - 我将非常感谢您的帮助!

我正在为客户维护一个旧的 MFC 项目(一个 Win32 应用程序)。该应用程序使用一个大型 ActiveX 控件 - 由另一组在 .NET/C# 中开发。该控件显示在容器窗口 (CFormView) 中。假设 Win32 应用程序使用大约 10MB 而 .NET 控件使用 100MB:

  1. 我启动 Win32 应用程序 - 进程使用 10MB
  2. 我用 ActiveX 控件启动一个容器窗口 - 进程使用 110MB
  3. 容器及其 ​​ActiveX 控件已关闭/删除 - 进程使用 110MB
  4. 我用 ActiveX 控件启动了一个新容器 -进程使用 210MB

删除容器窗口及其控件时,不会释放内存。也许控件仍在运行。经过几次迭代后,内存消耗就失控了。

ActiveX 控件使用普通的 CWnd 对象显示。创建容器后,将通过调用 CWnd::CreateControl() 创建控件。应用程序使用 CWnd::InvokeHelper() 调用方法,并且来自控件的事件通过事件接收器映射处理。这工作/似乎工作正常。应用程序不导入 TLB 文件。它根据它的注册名称(链接到控件的 DLL)创建控件,并使用 IDispatch::GetIDsOfNames() 来获取要调用的方法的 dispid。

控件没有“持久性”;我们希望它在对话框关闭时完全释放。可以有两个容器窗口同时打开控件 - 控件不应相互干扰。

没有专门停用/关闭 ActiveX 的代码。CWnd 对象在销毁/删除容器之前被删除。这对于其他类型的控件(例如 CEdit 或 CComboBox)通常就足够了;类析构函数破坏窗口并释放所有资源。

有很多关于 ActiveX 的文档,但如果您不是专家,这会很令人困惑……删除 CWnd 对象是否不足以阻止 ActiveX 控件运行并取消分配所有内容?我们应该在删除 CWnd 对象之前调用其他方法吗?

或者这可能是 ActiveX 控件中的一些错误 - 我应该告诉 .NET 开发人员什么?他们会错过什么吗?

一个想法?我可以阅读和测试十天而不会变得更聪明,唉...... :-(

/来自瑞典的安德斯

标签: .netmemorymemory-leaksmfcactivex

解决方案


推荐阅读