第七章 Windows编程基础
7.1 7.2 7.3 7.4 7.5 动态链接库( 动态链接库(DLL) ) Windows API及其函数 及其函数 消息处理 多线程编程 文件访问
7.1 动态链接库(DLL) 动态链接库(
什么是DLL 一、什么是 二、DLL项目文件 项目文件 创建DLL 三、创建 四、DLL中的初始化代码 中的初始化代码 调用DLL 五、调用
一、什么是DLL
Windows允许同时运行的多个程序共享一 允许同时运行的多个程序共享一 组函数的单一拷贝, 组函数的单一拷贝,于是引入了动态链接 方式, 方式,将可共享的程序代码以及各种数据 资源编译成单独的模块, 资源编译成单独的模块,即动态链接库 (DLL)。 )。
二、DLL项目文件
在Delphi的IDE中,编写 的 中 编写DLL程序与一般 程序与一般 的应用程序没有太大的区别,除了在内存、 的应用程序没有太大的区别,除了在内存、 资源管理上有所不同外, 资源管理上有所不同外,区别主要体现在 项目文件上。 项目文件上。项目文件是一个应用程序项 目的主程序。选择执行菜单【 目的主程序。选择执行菜单【Project】→ 】 【View Source】项,可以在编辑窗口打 】 开相应的项目文件。 开相应的项目文件。
DLL项目文件的格式如下: 项目文件的格式如下: 项目文件的格式如下 library 程序标识符号 程序标识符号; uses 单元列表 单元列表; exports 过程和函数标识符
列表 过程和函数标识符列表; begin 程序体; 程序体 end.
三、创建DLL
创建DLL项目的一般步骤如下: 项目的一般步骤如下: 创建 项目的一般步骤如下 的应用程序模板, 程序框架; (1)利用 )利用Delphi的应用程序模板,建立一个 的应用程序模板 建立一个DLL程序框架; 程序框架 (2)保存文件; )保存文件; 项目文件内编写过程和函数代码, ( 3) 直接在 ) 直接在DLL项目文件内编写过程和函数代码 , 或将 项目文件内编写过程和函数代码 过程和函数代码组织为一个单元,并在DLL项目文件中 过程和函数代码组织为一个单元,并在 项目文件中 引用该单元; 引用该单元; (4)需要被其他应用程序动态链接的过程或函数,必须在 )需要被其他应用程序动态链接的过程或函数, 过程或函数头的尾部加上export编译指令, 同时将这些 编译指令, 过程或函数头的尾部加上 编译指令 过程和函数名在DLL项目文件的保留字 项目文件的保留字exports后列出; 后列出; 过程和函数名在 项目文件的保留字 后列出 (5)编写DLL的初始化代码,这一步是可选的; )编写 的初始化代码,这一步是可选的; 的初始化代码 文件。 (6)编译程序,生成 )编译程序,生成DLL文件。 文件
四、DLL中的
初始化代码
DLL加载时一些必要的初始化操作如开锁数 加载时一些必要的初始化操作如开锁数 据段、分配内存等,由系统自动完成。 据段、分配内存等,由系统自动完成。在 需要的情况下, 可以在DLL项目文件的 需要的情况下 , 可以在 项目文件的 begin…end.之间添加自定义的初始化代码, 之间添加自定义的初始化代码, 之间添加自定义的初始化代码 来完成下列一些操作: 来完成下列一些操作: 初始化变量、分配全局内存块、 初始化变量、分配全局内存块、登录窗 口对象等初始化工作。 口对象等初始化工作。 设置DLL退出时需要执行的某些自定 设置 退出时需要执行的某些自定 的操作。 的操作。
五、调用DLL
1. 静态引入 静态引入又称为隐式调用,即把DLL过程或 静态引入又称为隐式调用,即把 过程或 函数视为一个外部过程或函数来定义, 函数视为一个外部过程或函数来定义,使 用时与一般过程或函数相同, 用时与一般过程或函数相同,看不出它是 一个DLL。当隐式调用 一个 。当隐式调用DLL的应用程序启 的应用程序启 动后,立即静态引入DLL的过程或函数。 的过程或函数。 动后,立即静态引入 的过程或函数 如果此DLL不存在,那么程序刚启