现在的位置: 首页 > 综合 > 正文

显式加载DLL模块

2014年02月17日 ⁄ 综合 ⁄ 共 1802字 ⁄ 字号 评论关闭

无论何时,进程中的线程都可以决定将一个DLL映射到进程的地址空间,方法是调用下面两个函数中的一个:

HINSTANCE LoadLibrary(PCTSTR pszDLLPathName);

 

HINSTANCE LoadLibrary(

   PCTSTR pszDLLPathName,

   HANDLE hFile,

    DWORD dwFlags);

这两个函数均用于找出用户系统上的文件映像(使用上一章中介绍的搜索算法),并设法将DLL的文件映像映射到调用进程的地址空间中。两个函数返回的HINSTANCE值用于标识文件映像映射到的虚拟内存地址。如果DLL不能被映射到进程的地址空间,则返回NULL。若要了解关于错误的详细信息,可以调用GetLastError.

你会注意到,LoadLibraryEx函数配有两个辅助参数,即hFile和dwFlags。参数hFile保留供将来使用,现在必须是NULL。对于参数dwFlags,必须将它设置为0,或者设置为DONT_RESOLVE_DLL_REFERENCES、LOAD_LIBRARY_AS_DATAFILE和LOAD_WITH_ALTERED_SEARCH_PATH等标志的一个组合。

1.DONT_RESOLVE_DLL_REFERENCES

DONT_RESOLVE_DLL_REFERENCES标志用于告诉系统将DLL映射到调用进程的地址空间中。通常情况下,当DLL被映射到进程的地址空间中时,系统要调用DLL中的一个特殊函数,即DllMain(本章后面介绍)。该函数用于对DLL进行初始化。DONT_RESOLVE_DLL_REFERENCES标志使系统不必调用DllMain函数就能映射文件映像。

此外,DLL能够输入另一个DLL中包含的函数。当系统将一个DLL映射到进程的地址空间中时,它也要查看该DLL是否需要其他的DLL,并且自动加载这些DLL。当DONT_RESOLVE_DLL_REFERENCES标志被设定时,系统并不自动将其他的DLL加载到进程的地址空间中。

2.LOAD_LIBRARY_AS_DATAFILE

LOAD_LIBRARY_AS_DATAFILE标志与DONT_RESOLVE_DLL_REFERENCES标志相类似,因为系统只是将DLL映射到进程的地址空间中,就像它是数据文件一样。系统并不花费额外的时间来准备执行文件中的任何代码。例如,当一个DLL被映射到进程的地址空间中时,系统要查看DLL中的某些信息,以确定应该将哪些页面保护属性赋予文件的不同的节。如果设定了LOAD_LIBRARY_AS_DATAFILE标志,系统将以它要执行文件中的代码时的同样方式来设置页面保护属性。

由于下面几个原因,该标志是非常有用的。首先,如果有一个DLL(它只包含资源,但不包含函数),那么可以设定这个标志,使DLL的文件映像能够映射到进程的地址空间中。然后可以在调用加载资源的函数时,使用LoadLibraryEx函数返回的HINSTANCE值。通常情况下,加载一个.exe文件,就能够启动一个新进程,但是也可以使用LoadLibraryEx函数将.exe文件的映像映射到进程的地址空间中。借助映射的.exe文件的HINSTANCE值,就能够访问文件中的资源。由于.exe文件没有DllMain函数,因此,当调用LoadLibraryEx来加载一个.exe文件时,必须设定LOAD_LIBRARY_AS_DATAFILE标志。

3.LOAD_WITH_ALTERED_SEARCH_PATH

LOAD_WITH_ALTERED_SEARCH_PATH标志用于改变LoadLibraryEx用来查找特定的DLL文件时使用的搜索算法。通常情况下,LoadLibraryEx按照第19章讲述的顺序进行文件的搜索。但是,如果设定了LOAD_WITH_ALTERED_SEARCH_PATH标志,那么LoadLibraryEx函数就按照下面的顺序来搜索文件:

1)pszDLLPathName参数中设定的目录。

2)进程的当前目录。

3)Windows的系统目录。

4)Windows目录。

5)PATH环境变量中列出的目录。

原文:http://hi.baidu.com/onlinewan/blog/item/d70c30299f8d5efd99250aeb.html

抱歉!评论已关闭.