Windows中是否有某种方法可以防止通过FreeLibrary卸载我们的dll?即为了过程的生命,将它“固定”在内存中?
答案 0 :(得分:21)
我知道这是一个旧线程,但有一种'正确'的方法可以做到这一点:
使用GetModuleHandleEx
标记致电GET_MODULE_HANDLE_EX_FLAG_PIN
。
来自MSDN:
无论FreeLibrary被调用多少次,模块都会一直保持加载状态,直到进程终止。
以防万一其他人找到这个帖子......
答案 1 :(得分:8)
是。在该DLL上调用LoadLibrary()。这将增加内部引用计数。 FreeLibrary()仅在其内部引用计数降至零时卸载DLL。如果您使用LoadLibrary而从不使用FreeLibrary,则DLL将在您的进程的生命周期内停留在内存中。
如果您遇到某人在您的DLL上调用FreeLibrary()并导致其在您仍在使用时从内存中删除的情况,您可能有一个错误 - 对谁拥有的分歧或误解DLL并负责释放它。一个错误,应该修复而不是由LoadLibrary黑客解决。
答案 2 :(得分:0)
MSVC为“延迟加载的DLL”提供选项(至少在VC 2005+中)并支持“延迟加载的DLL卸载”。可能还需要查看这些设置,确保不支持卸载。