《Delphi程序设计与应用教程》电子教案 第七章Windows编程基础

上传人:E**** 文档编号:89400709 上传时间:2019-05-24 格式:PPT 页数:37 大小:122.50KB
返回 下载 相关 举报
《Delphi程序设计与应用教程》电子教案 第七章Windows编程基础_第1页
第1页 / 共37页
《Delphi程序设计与应用教程》电子教案 第七章Windows编程基础_第2页
第2页 / 共37页
《Delphi程序设计与应用教程》电子教案 第七章Windows编程基础_第3页
第3页 / 共37页
《Delphi程序设计与应用教程》电子教案 第七章Windows编程基础_第4页
第4页 / 共37页
《Delphi程序设计与应用教程》电子教案 第七章Windows编程基础_第5页
第5页 / 共37页
点击查看更多>>
资源描述

《《Delphi程序设计与应用教程》电子教案 第七章Windows编程基础》由会员分享,可在线阅读,更多相关《《Delphi程序设计与应用教程》电子教案 第七章Windows编程基础(37页珍藏版)》请在金锄头文库上搜索。

1、第七章 Windows编程基础,7.1 动态链接库(DLL) 7.2 Windows API及其函数 7.3 消息处理 7.4 多线程编程 7.5 文件访问,7.1 动态链接库(DLL),一、什么是DLL 二、DLL项目文件 三、创建DLL 四、DLL中的初始化代码 五、调用DLL,一、什么是DLL,Windows允许同时运行的多个程序共享一组函数的单一拷贝,于是引入了动态链接方式,将可共享的程序代码以及各种数据资源编译成单独的模块,即动态链接库(DLL)。,二、DLL项目文件,在Delphi的IDE中,编写DLL程序与一般的应用程序没有太大的区别,除了在内存、资源管理上有所不同外,区别主要体

2、现在项目文件上。项目文件是一个应用程序项目的主程序。选择执行菜单【Project】【View Source】项,可以在编辑窗口打开相应的项目文件。,DLL项目文件的格式如下: library 程序标识符号; uses 单元列表; exports 过程和函数标识符列表; begin 程序体; end.,三、创建DLL,创建DLL项目的一般步骤如下: (1)利用Delphi的应用程序模板,建立一个DLL程序框架; (2)保存文件; (3)直接在DLL项目文件内编写过程和函数代码,或将过程和函数代码组织为一个单元,并在DLL项目文件中引用该单元; (4)需要被其他应用程序动态链接的过程或函数,必须在

3、过程或函数头的尾部加上export编译指令,同时将这些过程和函数名在DLL项目文件的保留字exports后列出; (5)编写DLL的初始化代码,这一步是可选的; (6)编译程序,生成DLL文件。,四、DLL中的初始化代码,DLL加载时一些必要的初始化操作如开锁数据段、分配内存等,由系统自动完成。在需要的情况下,可以在DLL项目文件的beginend.之间添加自定义的初始化代码,来完成下列一些操作: l 初始化变量、分配全局内存块、登录窗口对象等初始化工作。 l 设置DLL退出时需要执行的某些自定的操作。,五、调用DLL,1. 静态引入 静态引入又称为隐式调用,即把DLL过程或函数视为一个外部过

4、程或函数来定义,使用时与一般过程或函数相同,看不出它是一个DLL。当隐式调用DLL的应用程序启动后,立即静态引入DLL的过程或函数。如果此DLL不存在,那么程序刚启动就提示错误,并终止程序的运行。,2. 动态引入 不必在应用程序启动时立即静态引入DLL,可在程序运行的必要时刻,动态引入DLL。动态方式不仅灵活,而且较为安全。缺陷是:若DLL文件较大,且引入时为首次引导加载,则影响运行速度。,7.2 Windows API及其函数,一、Windows API函数分类 二、API函数调用,一、Windows API函数分类,Windows API由其定义的数据结构、常量和数百个函数组成,它们分布于

5、Windows提供的众多动态链接库中。根据API函数的来源以及Delphi所定义的相对应单元,可将API函数做出如表7-3的划分 。,二、API函数调用,Delphi中已经定义了相应的单元,给出了所有Windows API函数的编程接口,因此可以在Delphi程序中直接调用API函数。虽然API函数调用就是DLL调用,但在Delphi中调用API函数非常简单,不需要声明外部引入,只需在Uses保留字后声明相应的单元即可。DLL引入的操作定义已由Delphi预先定义的单元完成。,7.3 消息处理,一、Windows的消息机制 二、Delphi的消息处理 三、发送消息 四、响应消息,一、Windo

6、ws的消息机制,Windows并不通知应用程序应该完成什么工作,而是通知应用程序发生了什么事情,这便是所谓的消息,然后,由截获消息的应用程序自己决定如何去处理这些事件。 一个应用程序一旦启动,Windows便为该应用程序建立一个消息队列(message queue),开始且陆续地将与该应用程序有关的消息加入它的队尾。应用程序则要逐个地将其消息队列中的队头消息取出,筛选出有用的消息,再指派给某个窗口过程,由其对消息进行处理和做出响应。从某种意义上讲,Windows的应用程序不过是一个消息处理器。事件就是被消息所驱动的。每个应用程序内部必定有一段循环程序,负责检索其消息队列,这段特殊的程序称为消息

7、循环(message loop)。,消息的数据结构在Windows中被定义为如下的记录类型: TMessage = record Msg: Cardinal; WParam: Word; LParam: Longint; Result: Longint; end;,消息定义为如下的TMsg记录类型: TMsg = packed record hwnd: HWND; message: UINT; wParam: WPARAM; lParam: LPARAM; time: DWORD; pt: TPoint; end;,二、Delphi的消息处理,三、发送消息,下列两个Windows API函数均

8、可实现消息的发送。 function SendMessage(hWnd:HWND; Msg:UINT; wParam:WPARAM; lParam:LPARAM) :LRESULT; stdcall; function PostMessage(hWnd:HWND; Msg:UINT; wParam:WPARAM; lParam:LPARAM) : BOOL; stdcall;,四、响应消息,1. 覆盖组件继承的虚拟方法WndProc procedure TNewComponent.WndProc(var message:TMessage); begin if message.Msg = 需要过

9、滤的消息 then begin / 此处编写处理过滤消息代码 exit; end; inherited WndProc(message); dispatch(message); end;,2. 覆盖组件继承的虚拟方法 DefaultHandler 在继承类中对DefaultHandler过程进行覆盖,同样可以实现类似于前一种方法的消息过滤。,3. 自定义消息和消息处理方法 Windows预定义了1024个编码从$0000到$03FF的消息常量标识符,留出从$0400到$7FFF的编码空间用于用户自定义消息。其中的$0400已定义为WM_USER。因此,自定义消息常量标识符的形式如下: cons

10、t WM_UserMsgName = WM_USER + N; / 其中,0=N=31743,4. TApplication的OnMessage事件 每当应用程序从消息队列中检索到一个消息时,便触发Application的OnMessage事件。由此,在消息被派送到对其响应和处理的目标对象之前,有机会处理该消息。,7.4 多线程编程,一、进程与线程 二、TThread类 三、创建线程类 四、线程的优先级与线程调度 五、线程的挂起、恢复和终止 六、线程的协调,一、进程与线程,在Windows操作系统中,可以同时运行多个程序,甚至可以启动一个程序的多个实例,此即所谓的多任务。可见,静态的程序与在计

11、算机中运行的程序是有区别的。为明确概念,特将载入内存准备执行的应用程序称为进程。,进程由下列部分组成: l 一个私有的、4GB大小的虚拟地址空间; l 程序相关的代码和数据; l 操作系统分配给进程的系统资源,如文件、单独的消息队列、同步对象等; l 至少包含一个线程,这个线程称为主线程,通过它可以创建或控制其他线程。,进程本身并不直接执行代码,进程内的基本执行单元是线程。一个进程可以包含多个线程,每个线程都可以独立运行,并保持各自的堆栈和寄存器的值。一个线程可以控制另一个线程的执行,一个进程内的各个线程共享该进程的虚拟空间和系统资源。而不同进程之间则互不干扰。,二、TThread类,TThr

12、ead类封装了Windows API和System单元中有关线程运用的函数和例程。与VCL中一般的类不同的是:TThread类是一个抽象类,其所带方法是虚拟抽象的,因而不能直接创建TThread的对象实例,而必须先声明一个由TThread继承来的线程类,再利用这个派生类创建线程对象实例和操纵线程具体类的属性和方法。,1. TThread类的属性 Suspended属性、Terminated属性 、Priority属性 、FreeOnTerminate属性 、ReturnValue属性 。 2. TThread类的方法 Create方法、Execute方法 、Suspend方法、Resume方法

13、 、Terminate方法 、DoTerminate方法 、Synchronize方法 、WaitFor方法 3. TThread类的事件 TThread仅定义了一个OnTerminate事件,当线程对象运行终止时触发该事件。编写该事件代码,可用于通知应用程序的主线程该线程已结束运行。,三、创建线程类,Delphi为新建各种类型的文件提供了丰富的模板,其中也包括新建由TThread派生出的线程类单元的模板。,四、线程的优先级与线程调度,每个线程都会赋予一个最低从0到最高为31的优先级编号,操作系统将CPU时间片优先分配给优先级高的线程,高优先级的线程将抢在低优先级线程之前运行。无论低优先级线程

14、的运行正处在其时间片的什么时候,若操作系统发现一个高优先级的线程准备要运行,便立即暂停低优先级线程的运行,而将一个完整的时间片分配给高优先级线程。32位的Windows系统便是采取这种抢先式的线程调度方式。,五、线程的挂起、恢复和终止,何时挂起和唤醒线程主要由操作系统负责调度。然而,应用程序可以使用TThread类的Suspend方法挂起线程,暂停其执行,使用Resume方法唤醒线程,恢复其运行。线程可以自己挂起,但不能自己恢复运行,必须由其他线程恢复它的运行。线程的Execute方法代码执行结束时,即意味着线程的终止,线程自动退出。,六、线程的协调,1. 线程互斥 VCL中提供了3种解决线程

15、互斥的方法。 (1)锁定对象 (2)设置临界段 (3)共享读与独占写,2. 线程同步 一个线程需要等待其他线程的任务结束才能继续,那么可以暂时挂起线程。有下列两种情况: (1)等待其他线程终止 (2)等待一个作业完成,7.5 文件访问,一、Pascal方式的文件访问 二、Windows API方式的文件访问,一、Pascal方式的文件访问,Delphi中保留了Turbo Pascal传统的文件概念和标准的文件输入和输出子程序(定义于System单元,引用时不必声明)。对文件的访问,一般按照如下步骤进行: (1)声明文件变量的类型。 (2)将文件变量与外部文件关联起来。 (3)打开文件。 (4)读、写文件。 (5)文件定位。 (6)关闭文件。,二、Windows API方式的文件访问,Delphi的SysUtils单元封装了Windows提供的文件输入/输出的API函数,以及默认参数的常量定义。这些API函数的Pascal语法定义如表7-8所示。与传统的Pascal文件访问方式相比,文件句柄方式在打开文件时提供了更多的可选参数,如设置与网络共享有关的的参数等,文件定位方式也较为灵活。然而,传统的Pascal方式由于可以定义有类型(读写数据元素的类型)的文件,读写数据部分的程序编写较为简洁。,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号