加载dll以及卸载dll相关的几个API

普及一下知识:
(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); 
展开阅读全文

没有更多推荐了,返回首页