Use*_*902 21 winapi loadlibrary
如果我使用Win32 API LoadLibrary连续3次加载相同的DLL,它应该返回3个不同的句柄,每个库中的函数应该都有不同的地址是否正确?(或者它是否做了"智能"操作并检测是否已经为进程加载了dll并且只是指向同一个模块?)
Pet*_*man 23
它做得很聪明.Windows为通过LoadLibrary加载的每个DLL保留引用计数.这就是为什么你必须为每个相应的LoadLibrary调用调用FreeLibrary一次.假设你没有先释放DLL,每次调用LoadLibrary都会给你相同的句柄.
从FreeLibrary的MSDN文档:
每个进程都为每个已加载的库模块维护引用计数.每次调用LoadLibrary时,此引用计数都会递增,并且每次调用FreeLibrary时都会递减.
如果它们是相同的DLL,则它不会再次加载它.
http://msdn.microsoft.com/en-us/library/ms684175(VS.85).aspx
"如果指定的模块是尚未为调用进程加载的DLL,则系统使用DLL_PROCESS_ATTACH值调用DLL的DllMain函数.如果DllMain返回TRUE,则LoadLibrary返回模块的句柄.如果DllMain返回FALSE,则系统从进程地址空间卸载DLL并且LoadLibrary返回NULL.从DllMain调用LoadLibrary是不安全的.有关更多信息,请参阅DllMain中的备注部分.
"如果lpFileName不包含路径,并且有多个加载的模块具有相同的基本名称和扩展名,则该函数将返回首先加载的模块的句柄."
归档时间: |
|
查看次数: |
8886 次 |
最近记录: |