问题描述
如果我使用 Win32 API LoadLibrary 连续加载同一个 DLL 3 次,它应该返回 3 个不同的句柄,并且每个库中的函数都应该有不同的地址,正确吗?(或者它是否做了一些聪明"的事情并检测是否已经为进程加载了 dll 并只指向同一个模块?)
If I use the Win32 API LoadLibrary to load the same DLL 3 times in a row it should return 3 distinct handles and the functions in each library should all have different addresses correct? (Or does it do something "smart" and detect if the dll has already been loaded for the process and just point to the same module?)
推荐答案
它做了一些聪明的事情.Windows 为通过 LoadLibrary 加载的每个 DLL 保留一个引用计数.这就是为什么您必须为每个相应的 LoadLibrary 调用调用一次 FreeLibrary.假设您没有先释放 DLL,那么每次调用 LoadLibrary 都会为您提供相同的句柄.
It does something smart. Windows keeps a reference count for each DLL loaded through LoadLibrary. That's why you have to call FreeLibrary once for each corresponding LoadLibrary call. Assuming you don't free the DLL first, each call to LoadLibrary will give you the same handle.
来自 FreeLibrary 的 MSDN 文档:
From the MSDN documentation for FreeLibrary:
每个进程为每个加载的库模块维护一个引用计数.此引用计数在每次调用 LoadLibrary 时递增,每次调用 FreeLibrary 时递减.
这篇关于LoadLibrary 是否创建不同的实例?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!