DLL高级技术:显式加载与符号链接解析

需积分: 10 3 下载量 69 浏览量 更新于2024-07-25 收藏 2.3MB PDF 举报
"DLL高级技术,包括DLL的显式加载、符号链接等操作,适用于DLL的开发和深入研究。" 在Windows编程中,动态链接库(Dynamic Link Library, DLL)是一种可共享的代码库,允许多个应用程序共享同一份代码,从而节省系统资源。DLL的使用分为隐含加载和显式加载,而本章节主要关注更复杂的DLL高级操作技术,特别是显式加载和符号链接。 **20.1 DLL模块的显式加载和符号链接** 显式加载DLL不同于隐含加载,后者在程序编译链接时就确定了需要使用的DLL。显式加载则是在程序运行时通过API函数`LoadLibrary(Ex)`来完成的。以下是显式加载DLL的过程: 1. 应用程序首先不直接引用DLL中的函数或变量,这样在编译阶段不会自动加载DLL。 2. 在需要使用DLL功能时,程序通过`LoadLibrary(Ex)`函数加载DLL到进程的地址空间。 3. 加载成功后,使用`GetProcAddress`函数获取DLL中特定函数的地址。 4. 程序使用获取的函数地址直接调用DLL中的函数。 这个过程提供了更大的灵活性,比如在运行时根据条件决定是否加载DLL,或者动态更新DLL而无需重新启动程序。 **创建DLL和EXE的过程** 创建DLL通常涉及以下步骤: 1. 定义头文件,声明DLL将导出的函数和数据结构。 2. 编写实现这些函数的源代码。 3. 使用编译器为每个源文件生成.obj模块。 4. 链接所有.obj模块,生成DLL文件。如果DLL导出了函数或变量,链接器还会生成一个.lib文件,供其他程序使用。 创建使用DLL的EXE程序时: 1. 根据需要,定义头文件,声明从DLL导入的函数和数据结构。 2. 编写不直接引用DLL函数的源代码。 3. 编译源代码生成.obj模块。 4. 链接所有.obj模块,生成.exe文件。此时,EXE文件不会包含DLL的输入表,因为它依赖于运行时的显式加载。 **运行时的DLL加载** 在应用程序启动时,如果使用隐含加载,加载程序会根据.exe文件中的信息自动加载必要的DLL。但如果是显式加载,必须在程序中调用`LoadLibrary(Ex)`来加载DLL,然后使用`GetProcAddress`获取函数指针,最后才能调用DLL中的函数。 显式加载的一个关键优势在于它允许程序在运行时决定是否需要特定的DLL服务,以及何时使用这些服务。此外,显式加载还可以用于延迟加载DLL,即直到真正需要时才加载,进一步优化程序性能。 DLL的高级技术扩展了DLL的功能和灵活性,使得开发人员可以根据需求选择合适的加载方式,实现更复杂的应用场景。对于DLL的开发和研究,理解这些高级技术至关重要。