gpt4 book ai didi

c++ - 激活上下文导致动态加载的 DLL 上的文件句柄泄漏

转载 作者:可可西里 更新时间:2023-11-01 12:09:18 27 4
gpt4 key购买 nike

我有一个动态加载和卸载的 DLL,它需要 COMCTL32.dll >= v6.0 和 MSVCR >= v9.0。为确保加载正确的版本,我在 Visual Studio 项目设置中启用 list 文件生成,并将此条目添加到另一个 list 文件:

<dependency><br/>
<dependentAssembly><br/>
<assemblyIdentity<br/>
type="win32"<br/>
name="Microsoft.Windows.Common-Controls"<br/>
version="6.0.0.0"<br/>
processorArchitecture="*"<br/>
publicKeyToken="6595b64144ccf1df"<br/>
language="*"<br/>
/><br/>
</dependentAssembly><br/>
</dependency>

在一个测试程序中我调用了LoadLibrary()其次是 FreeLibrary()该 DLL,并且 ProcessExplorer 指示以下文件句柄已泄漏:

  • C:\WINDOWS\WinSxS\x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.30729.1_x-ww_6f74963e
  • C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.5512_x-ww_35d4ce83

从反汇编调用堆栈跟踪中我了解到 LoadLibrary() , 一个激活上下文被自动创建并且它打开这些文件夹中的每一个的句柄。但似乎在 FreeLibrary() 上未删除激活上下文.

如果我删除 list 文件并将项目设置设置为禁用 list 生成,这些泄漏就会消失。但是,那样我将无法确保使用正确的 MSVCR 和 COMCTL,因为这个 DLL 是由我无法控制的进程加载的。

有没有办法在不删除 list 文件的情况下消除此泄漏

谢谢!

最佳答案

ProcessExplorer HANDLE 泄漏报告是激活上下文泄漏的症状。由于您没有正确调用 MFC,这种泄漏很可能间接存在于您的代码中。

为了帮助您自己验证这是您的错误而不是 MFC 的错误,您可以在没有任何代码的情况下从 AppWizard 创建一个简单的 MFC DLL,并确认当它多次 LoadLibrary/FreeLibrary 时,没有累积泄漏。

缺少的操作系统调用是 ReleaseActCtx 或缺少的 DeactivateActCtx,导致发布失败。在实践中,MFC 会为您调用这些函数,因此您将寻找某种缺失的 MFC 调用。

最好的调试技术可能是跟踪或断点核心激活上下文创建/激活/停用/释放函数 (http://msdn.microsoft.com/en-us/library/aa374166(VS.85)。 aspx) 看看会发生什么。您可能会看到一堆电话,因此可能需要进行某种跟踪。理想情况下,您可以在每次调用时捕获调用堆栈并查看它们。您的调试器也许能够帮助您完成这项工作。最新版本的 VS 可以在遇到断点时运行宏。

顺便说一句,您需要 list 文件并且不应删除它们是正确的。

马丁

关于c++ - 激活上下文导致动态加载的 DLL 上的文件句柄泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3173739/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com