.net - 内存未释放 - MFC 应用程序中使用的 ActiveX 控件 (.NET/C#)
问题描述
我的 COM/OLE/ActiveX 组件存在内存问题。但我只知道 ActiveX 的基础知识……我在这里联系 ActiveX 专家 - 我将非常感谢您的帮助!
我正在为客户维护一个旧的 MFC 项目(一个 Win32 应用程序)。该应用程序使用一个大型 ActiveX 控件 - 由另一组在 .NET/C# 中开发。该控件显示在容器窗口 (CFormView) 中。假设 Win32 应用程序使用大约 10MB 而 .NET 控件使用 100MB:
- 我启动 Win32 应用程序 - 进程使用 10MB
- 我用 ActiveX 控件启动一个容器窗口 - 进程使用 110MB
- 容器及其 ActiveX 控件已关闭/删除 - 进程使用 110MB
- 我用 ActiveX 控件启动了一个新容器 -进程使用 210MB
删除容器窗口及其控件时,不会释放内存。也许控件仍在运行。经过几次迭代后,内存消耗就失控了。
ActiveX 控件使用普通的 CWnd 对象显示。创建容器后,将通过调用 CWnd::CreateControl() 创建控件。应用程序使用 CWnd::InvokeHelper() 调用方法,并且来自控件的事件通过事件接收器映射处理。这工作/似乎工作正常。应用程序不导入 TLB 文件。它根据它的注册名称(链接到控件的 DLL)创建控件,并使用 IDispatch::GetIDsOfNames() 来获取要调用的方法的 dispid。
控件没有“持久性”;我们希望它在对话框关闭时完全释放。可以有两个容器窗口同时打开控件 - 控件不应相互干扰。
没有专门停用/关闭 ActiveX 的代码。CWnd 对象在销毁/删除容器之前被删除。这对于其他类型的控件(例如 CEdit 或 CComboBox)通常就足够了;类析构函数破坏窗口并释放所有资源。
有很多关于 ActiveX 的文档,但如果您不是专家,这会很令人困惑……删除 CWnd 对象是否不足以阻止 ActiveX 控件运行并取消分配所有内容?我们应该在删除 CWnd 对象之前调用其他方法吗?
或者这可能是 ActiveX 控件中的一些错误 - 我应该告诉 .NET 开发人员什么?他们会错过什么吗?
一个想法?我可以阅读和测试十天而不会变得更聪明,唉...... :-(
/来自瑞典的安德斯
解决方案
推荐阅读
- r - 如何使用ggplot制作虚线和图例
- python - Python:使用 OpenCV 进行字母修复以进行文本识别
- amazon-web-services - 从 Hyperledger 模板创建 CloudFormation 堆栈时 CREATE_FAILED
- php - MySQL 错误 mysqli::__construct(): (HY000/2002): Connection denied
- excel - 如何从另一张纸上的数据透视表中 COUNTIF "=#N/A"?
- javascript - Appium 如何检查 iOS 应用的 UI 以显示视图层次结构?
- jquery - 选择离被点击元素最近的类
- vba - Ms-Access to Excel Late Binging VBA
- python - 使用 JIRA Python API 时缺少属性
- python - 在网格中显示图像