有没有办法显式取消隐式链接的 DLL

Is there a way to explicitly detatch an implicitly linked DLL?

本文关键字:链接 DLL 消隐 取消 有没有      更新时间:2023-10-16

这不是用于生产代码,这是用于单元测试。

我们有一个旧版 DLL,它可以释放DLL_PROCESS_DETACH事件的资源。我们在可执行文件的静态销毁阶段遇到了崩溃情况,因为静态变量的析构函数试图访问 DLL 未映射的资源(悬空引用)。

我想在单元测试中重现此崩溃场景,以便证明我已经修复了它。

您可以使用 GetModuleHandle(LPCTSTR lpModuleName) 获取模块的句柄,并将其传递给FreeLibrary()

GetModuleHandle()的文档指出:

GetModuleHandle函数返回映射模块的句柄,而不增加其引用计数。但是,如果将此句柄传递给 FreeLibrary 函数,则映射模块的引用计数将递减。因此,不要将 GetModuleHandle 返回的句柄传递给 FreeLibrary 函数。这样做可能会导致过早取消映射 DLL 模块。

尽管警告不要这样做,但这听起来正是您想要做的。这应该很容易在你的方案中进行测试,以验证它是否执行你想要的操作。