加载dll以及卸载dll相关的几个API
2014-11-05 14:22
621 查看
普及一下知识:
(1)LoadLibrary函数将指定的DLL模块加载到进程的地址空间中。
调用成功,返回指定DLL文件的句柄,DLL句柄用来标识一个DLL文件。
调用失败,返回NULL。
(2)LoadLibraryEx函数也可以加载指定的DLL模块。
调用成功,返回指定DLL文件的句柄,DLL句柄用来标识一个DLL文件。
调用失败,返回NULL。
参数dwFlags取值如下:
附上更啰嗦的说明:
当调用LoadLibrary函数或者LoadLibraryEx函数时,系统会定位指定的DLL。
如果找到,则把DLL模块映射到进程的虚拟内存中,并增加DLL的引用计数。
如果指定的DLL已经映射到调用进程的虚拟内存中,函数只是返回DLL的句柄,并不增加DLL的引用计数。
然后系统会在LoadLibrary函数或者LoadLibraryEx函数的线程上下文中调用DLL的入口函数DLLMain()。
如果系统找不到DLL文件,或者DLL的入口函数DllMain返回FALSE,则LoadLibrary函数或者LoadLibraryEx函数返回NULL。
如果LoadLibrary函数或者LoadLibraryEx函数执行成功,返回DLL模块的句柄,DLL句柄可以用来标识一个DLL。
(3)GetModuleHandle函数也可以返回DLL模块句柄
调用成功,返回指定DLL文件的句柄,DLL句柄用来标识一个DLL文件。
调用失败,返回NULL。
附上更啰嗦的说明:
只有当DLL模块映射到进程的虚拟地址空间中时,GetModuleHandle函数才能执行成功。
与LoadLibrary函数或者LoadLibraryEx函数不同,GetModuleHandle函数不能增加DLL模块的引用计数。
(4)GetProcAddress函数获取DLL的导出函数地址。
调用成功,返回指定导出函数的地址。
调用失败,返回NULL。
(5)
如果不再需要使用DLL模块,则可以调用FreeLibrary()函数或是FreeLibraryAndExitThread()函数释放DLL模块,
减少DLL模块的引用计数,如果引用计数等于0,则从进程的虚拟地址空间卸载DLL代码。
FreeLibraryAndExitThread( )在释放DLL模块后终止调用线程。
The FreeLibraryAndExitThread function is implemented as:
FreeLibrary(hModule);
ExitThread(dwExitCode);
(1)LoadLibrary函数将指定的DLL模块加载到进程的地址空间中。
调用成功,返回指定DLL文件的句柄,DLL句柄用来标识一个DLL文件。
调用失败,返回NULL。
HMODULE LoadLibrary( LPCTSTR lpFileName // file name of module要加载的dll名 );
(2)LoadLibraryEx函数也可以加载指定的DLL模块。
调用成功,返回指定DLL文件的句柄,DLL句柄用来标识一个DLL文件。
调用失败,返回NULL。
HMODULE LoadLibraryEx( LPCTSTR lpFileName, // file name of module 要加载的DLL名 HANDLE hFile, // reserved, must be NULL保留必须使用NULL DWORD dwFlags // entry-point execution option 指定加载模块时采取的动作);
参数dwFlags取值如下:
DONT_RESOLVE_DLL_REFERENCES //不调用DLLMAIN函数。系统也不加载指定模块引用的其他模块 LOAD_LIBRARY_AS_DATAFILE //系统将指定的模块作为数据文件映射到调用进程的虚拟地址空间中 LOAD_WITH_ALTERED_SEARCH_PATH //使用替代搜索次序
附上更啰嗦的说明:
当调用LoadLibrary函数或者LoadLibraryEx函数时,系统会定位指定的DLL。
如果找到,则把DLL模块映射到进程的虚拟内存中,并增加DLL的引用计数。
如果指定的DLL已经映射到调用进程的虚拟内存中,函数只是返回DLL的句柄,并不增加DLL的引用计数。
然后系统会在LoadLibrary函数或者LoadLibraryEx函数的线程上下文中调用DLL的入口函数DLLMain()。
如果系统找不到DLL文件,或者DLL的入口函数DllMain返回FALSE,则LoadLibrary函数或者LoadLibraryEx函数返回NULL。
如果LoadLibrary函数或者LoadLibraryEx函数执行成功,返回DLL模块的句柄,DLL句柄可以用来标识一个DLL。
(3)GetModuleHandle函数也可以返回DLL模块句柄
调用成功,返回指定DLL文件的句柄,DLL句柄用来标识一个DLL文件。
调用失败,返回NULL。
HMODULE GetModuleHandle( LPCTSTR lpModuleName // module name 要加载的DLL文件名);
附上更啰嗦的说明:
只有当DLL模块映射到进程的虚拟地址空间中时,GetModuleHandle函数才能执行成功。
与LoadLibrary函数或者LoadLibraryEx函数不同,GetModuleHandle函数不能增加DLL模块的引用计数。
(4)GetProcAddress函数获取DLL的导出函数地址。
调用成功,返回指定导出函数的地址。
调用失败,返回NULL。
FARPROC GetProcAddress( HMODULE hModule, // handle to DLL module LPCSTR lpProcName // function name);
(5)
如果不再需要使用DLL模块,则可以调用FreeLibrary()函数或是FreeLibraryAndExitThread()函数释放DLL模块,
减少DLL模块的引用计数,如果引用计数等于0,则从进程的虚拟地址空间卸载DLL代码。
BOOL FreeLibrary( HMODULE hModule // handle to DLL module DLL模块句柄);//成功返回TRUE,失败返回FALSE。
FreeLibraryAndExitThread( )在释放DLL模块后终止调用线程。
VOID FreeLibraryAndExitThread( HMODULE hModule, // handle to the DLL module DLL模块句柄 DWORD dwExitCode // exit code for thread );
The FreeLibraryAndExitThread function is implemented as:
FreeLibrary(hModule);
ExitThread(dwExitCode);
相关文章推荐
- 关于项目中记录日志的几个相关jar报slf4j-api、slf4j-log4j12以及log4j之间什么关系?
- 一个动态加载/卸载DLL的例子
- Hook API相关技术以及例子,Hook API的原理其实是通过核心函数强制修改原API的头部指针
- C#中动态加载和卸载DLL
- C#中动态加载和卸载DLL(转)
- 搞一个动态加载dll竟然搞了半天,郁闷。动态加载 卸载 Assembly, Appdomain。
- 卸载IE7可能产生的几个问题以及解决方法
- C#中动态加载和卸载DLL
- 动态加载和卸载DLL
- C#中动态加载和卸载DLL
- 卸载Macfee杀毒软件之后Outlook无法加载项scanotlk.dll,outlook已经将其禁用
- DLL查看相关工具_以及相关注意事项
- C#中动态加载和卸载DLL
- C#中动态加载和卸载DLL
- C#中动态加载和卸载DLL
- C#中动态加载和卸载DLL
- Dotnet 动态加载和卸载dll
- C#中动态加载和卸载DLL
- C#中动态加载和卸载DLL
- gendisk,request与bio结构体;以及块设备驱动注册与注销,以及加载与卸载