windows核心编程指南20.pdf

windows核心编程指南20.pdf

ID:52242187

大小:2.30 MB

页数:32页

时间:2020-03-25

windows核心编程指南20.pdf_第1页
windows核心编程指南20.pdf_第2页
windows核心编程指南20.pdf_第3页
windows核心编程指南20.pdf_第4页
windows核心编程指南20.pdf_第5页
资源描述:

《windows核心编程指南20.pdf》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、下载第20章DLL的高级操作技术上一章介绍了DLL链接的基本方法,并且重点说明了隐含链接的技术,这是DLL链接的最常用的形式。虽然对于大多数应用程序来说,只要了解上一章介绍的知识就足够了,但是还可以使用DLL进行更多的工作。本章将要介绍与DLL相关的各种操作方法。大多数应用程序不一定需要这些方法,但是它们是非常有用的,所以应该对它们有所了解。20.1DLL模块的显式加载和符号链接如果线程需要调用DLL模块中的函数,那么DLL的文件映像必须映射到调用线程的进程地编译器编译器编译器编译器编译器编译器链接程序链接程

2、序创造DLL:1)建立带有输出原型/结构/符号的头文件。2)建立实现输出函数/变量的C/C++源文件。3)编译器为每个C/C++源文件生成.obj模块。4)链接程序将生成DLL的.obj模块链接起来。5)如果至少输出一个函数/变量,那么链接程序也生成.lib文件。创造EXE:6)建立带有输入原型/结构/符号的头文件(视情况而定)。7)建立不引用输入函数/变量的C/C++源文件。8)编译器为每个C/C++源文件生成.obj源文件。9)链接程序将各个.obj模块链接起来,生成.exe文件。注:DLL的lib文件是

3、不需要的,因为并不直接引用输出符号。.exe文件不包含输入表。运行应用程序:10)加载程序为.exe创建模块地址空进程的主线程开始执行;应用程序启动运行。显式加载DLL:11)一个线程调用LoadLibrary(Ex)函数,将DLL加载到进程的地址空间这时线程可以调用GetProcAddress以便间接引用DLL的输出符号。图20-1应用程序创建和显式链接DLL的示意图478计计第四部分动态链接库下载址空间中。可以用两种方法进行这项操作。第一种方法是让应用程序的源代码只引用DLL中包含的符号。这样,当应用程序

4、启动运行时,加载程序就能够隐含加载(和链接)需要的DLL。第二种方法是在应用程序运行时让应用程序显式加载需要的DLL并且显式链接到需要的输出符号。换句话说,当应用程序运行时,它里面的线程能够决定它是否要调用DLL中的函数。该线程可以将DLL显式加载到进程的地址空间,获得DLL中包含的函数的虚拟内存地址,然后使用该内存地址调用该函数。这种方法的优点是一切操作都是在应用程序运行时进行的。图20-1显示了一个应用程序是如何显式地加载DLL并且链接到它里面的符号的。20.1.1显式加载DLL模块无论何时,进程中的线程

5、都可以决定将一个DLL映射到进程的地址空间,方法是调用下面两个函数中的一个:这两个函数均用于找出用户系统上的文件映像(使用上一章中介绍的搜索算法),并设法将DLL的文件映像映射到调用进程的地址空间中。两个函数返回的HINSTANCE值用于标识文件映像映射到的虚拟内存地址。如果DLL不能被映射到进程的地址空间,则返回NULL。若要了解关于错误的详细信息,可以调用GetLastError.你会注意到,LoadLibraryEx函数配有两个辅助参数,即hFile和dwFlags。参数hFile保留供将来使用,现在必

6、须是NULL。对于参数dwFlags,必须将它设置为0,或者设置为DONT_RESOLVE_DLL_REFERENCES、LOAD_LIBRARY_AS_DATAFILE和LOAD_WITH_ALTERED_SEARCH_PATH等标志的一个组合。1.DONT_RESOLVE_DLL_REFERENCESDONT_RESOLVE_DLL_REFERENCES标志用于告诉系统将DLL映射到调用进程的地址空间中。通常情况下,当DLL被映射到进程的地址空间中时,系统要调用DLL中的一个特殊函数,即DllMain(本

7、章后面介绍)。该函数用于对DLL进行初始化。DONT_RESOLVE_DLL_REFERENCES标志使系统不必调用DllMain函数就能映射文件映像。此外,DLL能够输入另一个DLL中包含的函数。当系统将一个DLL映射到进程的地址空间中时,它也要查看该DLL是否需要其他的DLL,并且自动加载这些DLL。当DONT_RESOLVE_DLL_REFERENCES标志被设定时,系统并不自动将其他的DLL加载到进程的地址空间中。2.LOAD_LIBRARY_AS_DATAFILELOAD_LIBRARY_AS_DA

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

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。