LoadLibraryEx功能将指定的可执行模块映射到调用进程的地址空间。可执行模块可以是.DLL或.EXE文件。指定的模块可能会导致其他模块映射到地址空间。
HINSTANCE LoadLibraryEx(
LPCTSTR 【lpLibFileName】, | //指向可执行模块的名称 |
HANDLE 【HFILE】, | // reserved,必须为NULL |
DWORD 【dwFlags中】 | //入口点执行标志 |
); |
参数
【lpLibFileName】
指向一个以空值终止的字符串,命名一个Win32可执行模块(.DLL或.EXE文件)。指定的名称是可执行模块的文件名。该名称与库模块本身存储的名称无关,如模块定义(.DEF)文件中的LIBRARY关键字所指定。
如果字符串指定路径,但该文件不存在于指定目录中,则该函数将失败。
如果字符串未指定路径,并且省略了文件扩展名,则该函数将默认库扩展名.DLL附加到文件名。但是,文件名字符串可以包括一个尾点字符(。),以指示模块名称没有扩展名。
如果字符串未指定路径,则该函数使用标准搜索策略来查找文件。有关详细信息,请参阅备注.
如果将指定的模块映射到地址空间中,操作系统将映射到其他相关的可执行模块中,该函数可以使用标准搜索策略或替代搜索策略来查找这些模块。有关详细信息,请参阅备注.
一旦该函数获得库模块文件的完全限定路径,则将路径与当前加载到调用进程的库模块的完整路径进行比较(以不区分大小写的方式)。这组库包括在进程启动时加载的库,以及以前通过调用LoadLibrary或LoadLibraryEx而不是通过调用FreeLibrary卸载的那些库。如果路径匹配已加载模块的路径,该函数只会增加模块的引用计数,并返回该库的模块句柄。
【HFILE】
此参数保留供将来使用。它必须为NULL。
【dwFlags中】
指定加载模块时要执行的操作。此参数可以是以下值之一:
旗 | 含义 | ||||
DONT_RESOLVE_DLL_REFERENCES | |||||
仅Windows NT: 如果给出此值,并且可执行模块是动态链接库(DLL),则操作系统不会调用DllEntryPoint函数进行进程和线程初始化和终止。此外,系统不加载由指定模块引用的其他可执行模块。 如果没有给出此值,并且可执行模块是DLL,则操作系统调用DllEntryPoint函数进行进程和线程初始化和终止。系统加载由指定模块引用的其他可执行模块。在这方面,该函数的行为与LoadLibrary【】的行为相同。 | |||||
LOAD_LIBRARY_AS_DATAFILE | |||||
如果给出这个值,该函数会将文件简单映射到地址空间中。相对于执行或准备执行映射文件中的代码,没有任何意义。该函数将模块加载为数据文件。在这种情况下,您可以使用函数返回的模块句柄与在资源上运行的Win32函数。当您要加载DLL以便从其中提取消息或资源时,请使用此标志,并且无意执行其代码。 如果没有给出此值,该函数将以可执行模块正常的方式将文件映射到地址空间。在这方面,该函数的行为与LoadLibrary的行为相同。 | |||||
LOAD_WITH_ALTERED_SEARCH_PATH | |||||
如果给出此值,并且【lpLibFileName】指定路径,则该函数将使用备注部分中讨论的备用文件搜索策略来查找指定模块导致加载的关联可执行模块。 如果未给出此值,或者【lpLibFileName】未指定路径,则该函数将使用备注部分中讨论的标准搜索策略来查找指定模块导致加载的关联可执行模块。在这方面,该函数的行为与LoadLibrary的行为相同。 |
返回值
如果函数成功,则返回值是映射的可执行模块的句柄。
如果函数失败,返回值为NULL。要获取扩展错误信息,请调用GetLastError.
备注
请注意,DONT_RESOLVE_DLL_REFERENCES标志仅在Windows NT平台上实现。它没有在Windows 95平台上实现。
调用进程可以使用此函数返回的句柄来标识对GetProcAddress,FindResource和LoadResource功能的调用中的模块。
LoadLibraryEx功能与LoadLibrary功能非常相似。差异包括LoadLibraryEx提供的一组可选行为。首先,LoadLibraryEx可以映射DLL模块而不调用该DLL的DllEntryPoint函数。第二,LoadLibraryEx可以使用两种文件搜索策略来查找与指定模块相关联的可执行模块。第三,LoadLibraryEx可以以对模块永远不会执行的情况进行优化的方式加载模块,将模块加载为数据文件。您可以通过设置【dwFlags中】参数来选择这些可选行为;如果【dwFlags中】为零,LoadLibraryEx的行为与LoadLibrary.相同
如果没有指定路径,LoadLibraryEx函数使用与LoadLibrary,SearchPath和OpenFile相同的标准文件搜索策略,用于查找可执行模块及其导致加载的任何关联的可执行模块。此标准策略按以下顺序搜索文件:
1.应用程序加载的目录。
2.当前目录。
3.Windows 95: Windows系统目录。使用GetSystemDirectory函数获取此目录的路径。
Windows NT: 32位Windows系统目录。使用GetSystemDirectory函数获取此目录的路径。该目录的名称是SYSTEM32。
4.Windows NT: 16位Windows系统目录。没有获取此目录的路径的Win32函数,但它被搜索。该目录的名称是SYSTEM。
5.Windows目录。使用GetWindowsDirectory函数获取此目录的路径。
6. PATH环境变量中列出的目录。
如果指定路径,并且【dwFlags中】参数设置为LOAD_WITH_ALTERED_SEARCH_PATH,则LoadLibraryEx函数使用备用文件搜索策略来查找指定模块导致加载的任何可执行模块。此替代策略按以下顺序搜索文件:
1.由【lpLibFileName】路径指定的目录。换句话说,指定的可执行模块所在的目录。
2.当前目录。
3.Windows 95: Windows系统目录。使用GetSystemDirectory函数获取此目录的路径。
Windows NT: 32位Windows系统目录。使用GetSystemDirectory函数获取此目录的路径。该目录的名称是SYSTEM32。
4.Windows NT: 16位Windows系统目录。没有获取此目录的路径的Win32函数,但它被搜索。该目录的名称是SYSTEM。
5.Windows目录。使用GetWindowsDirectory函数获取此目录的路径。
6. PATH环境变量中列出的目录。
请注意,标准文件搜索策略和备用搜索策略的区别在于:标准策略在调用应用程序的目录中开始搜索,替代策略在LoadLibraryEx正在加载的可执行模块的目录中开始搜索。
如果指定备用搜索策略,其行为将继续进行,直到找到所有相关的可执行模块。一旦系统开始处理DLL初始化程序,系统将恢复到标准的搜索策略。
也可以看看
DllEntryPoint, FindResource, FreeLibrary, GetProcAddress, GetSystemDirectory, GetWindowsDirectory, LoadLibrary, LoadResource, OpenFile, SearchPath