如果我使用Win32 API的LoadLibrary连续3次加载相同的DLL文件,它应该返回3个不同的句柄,并且每个库中的函数地址都应该是不同的吗?(或者它会做一些“聪明”的事情,检测进程是否已经加载了该DLL文件,并只是指向同一模块吗?)
它实现了一些智能功能。Windows通过LoadLibrary为每个已加载的DLL保留引用计数。这就是为什么每次对应的LoadLibrary调用后,您都必须调用FreeLibrary一次的原因。假设您没有先释放DLL,那么每次调用LoadLibrary将会给您相同的句柄。
根据MSDN文档中关于FreeLibrary的说明:
每个进程为每个已加载的库模块维护一个引用计数。该引用计数在每次调用LoadLibrary时递增,并在每次调用FreeLibrary时递减。