第七章 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不存在,那么程序刚启动就提 示错误,并终止程序的运行。
2. 动态引入 不必在应用程序启动时立即静态引入DLL, 可在程序运行的必要时刻,动态引入 DLL。动态方式不仅灵活,而且较为安 全。缺陷是:若DLL文件较大,且引入时 为首次引导加载,则影响运行速度。
7.2 Windows API及其函数
? 一、Windows API函数分类 ? 二、API函数调用
一、Windows API函数分类
? Windows API由其定义的数据结构、常
量 和数百个函数组成,它们分布于Windows 提供的众多动态链接库中。根据API函数 的来源以及Delphi所定义的相对应单元, 可将API函数做出如表7-3的划分 。
二、API函数调用
Delphi中已经定义了相应的单元,给出了 所有Windows API函数的编程接口,因此 可以在Delphi程序中直接调用API函数。 虽然API函数调用就是DLL调用,但在 Delphi中调用API函数非常简单,不需要 声明外部引入,只需在Uses保留字后声明 相应的单元即可。DLL引入的操作定义已 由
Delphi预先定义的单元完成。
7.3 消息处理
? ? ? ? 一、Windows的消息机制 二、Delphi的消息处理 三、发送消息 四、响应消息
一、Windows的消息机制
? Windows并不通知应用程序应该完成什么
工作,而是通 知应用程序发生了什么事情,这便是所谓的消息,然 后,由截获消息的应用
程序自己决定如何去处理这些事 件。 ? 一个应用程序一旦启动,Windows便为该应用程序建立 一个消息队列(message queue),开始且陆续地将与该 应用程序有关的消息加入它的队尾。应用程序则要逐个 地将其消息队列中的队头消息取出,筛选出有用的消 息,再指派给某个窗口过程,由其对消息进