Delphi 讲义教程 第七章 Windows编程基础.pdf

上传人:asd****56 文档编号:70322513 上传时间:2023-01-19 格式:PDF 页数:37 大小:217.36KB
返回 下载 相关 举报
Delphi 讲义教程 第七章 Windows编程基础.pdf_第1页
第1页 / 共37页
Delphi 讲义教程 第七章 Windows编程基础.pdf_第2页
第2页 / 共37页
点击查看更多>>
资源描述

《Delphi 讲义教程 第七章 Windows编程基础.pdf》由会员分享,可在线阅读,更多相关《Delphi 讲义教程 第七章 Windows编程基础.pdf(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允许同时运行的多个程序共享一组函数的单一拷贝,于是引入了动态链接方式,将可共享的程序代码以及各种数据资源编译成单独的模块,即动态链接库(允许同时运行的多个程

2、序共享一组函数的单一拷贝,于是引入了动态链接方式,将可共享的程序代码以及各种数据资源编译成单独的模块,即动态链接库(DLL)。)。二、二、DLL项目文件项目文件 在在Delphi的的IDE中,编写中,编写DLL程序与一般的应用程序没有太大的区别,除了在内存、资源管理上有所不同外,区别主要体现在项目文件上。项目文件是一个应用程序项目的主程序。选择执行菜单【程序与一般的应用程序没有太大的区别,除了在内存、资源管理上有所不同外,区别主要体现在项目文件上。项目文件是一个应用程序项目的主程序。选择执行菜单【Project】【】【View Source】项,可以在编辑窗口打开相应的项目文件。】项,可以在编

3、辑窗口打开相应的项目文件。DLL项目文件的格式如下:项目文件的格式如下:library 程序标识符号程序标识符号;uses 单元列表单元列表;exports 过程和函数标识符列表过程和函数标识符列表;begin程序体程序体;end.三、创建三、创建DLL创建创建DLL项目的一般步骤如下:(项目的一般步骤如下:(1)利用)利用Delphi的应用程序模板,建立一个的应用程序模板,建立一个DLL程序框架;(程序框架;(2)保存文件;()保存文件;(3)直接在)直接在DLL项目文件内编写过程和函数代码,或将过程和函数代码组织为一个单元,并在项目文件内编写过程和函数代码,或将过程和函数代码组织为一个单元

4、,并在DLL项目文件中引用该单元;(项目文件中引用该单元;(4)需要被其他应用程序动态链接的过程或函数,必须在过程或函数头的尾部加上)需要被其他应用程序动态链接的过程或函数,必须在过程或函数头的尾部加上export编译指令,同时将这些过程和函数名在编译指令,同时将这些过程和函数名在DLL项目文件的保留字项目文件的保留字exports后列出;(后列出;(5)编写)编写DLL的初始化代码,这一步是可选的;(的初始化代码,这一步是可选的;(6)编译程序,生成)编译程序,生成DLL文件。文件。四、四、DLL中的初始化代码中的初始化代码DLL加载时一些必要的初始化操作如开锁数据段、分配内存等,由系统自动

5、完成。在需要的情况下,可以在加载时一些必要的初始化操作如开锁数据段、分配内存等,由系统自动完成。在需要的情况下,可以在DLL项目文件的项目文件的beginend.之间添加自定义的初始化代码,来完成下列一些操作:之间添加自定义的初始化代码,来完成下列一些操作:初始化变量、分配全局内存块、登录窗口对象等初始化工作。初始化变量、分配全局内存块、登录窗口对象等初始化工作。设置 设置DLL退出时需要执行的某些自定的操作。退出时需要执行的某些自定的操作。五、调用五、调用DLL1.静态引入静态引入又称为隐式调用,即把静态引入静态引入又称为隐式调用,即把DLL过程或函数视为一个外部过程或函数来定义,使用时与一

6、般过程或函数相同,看不出它是一个过程或函数视为一个外部过程或函数来定义,使用时与一般过程或函数相同,看不出它是一个DLL。当隐式调用。当隐式调用DLL的应用程序启动后,立即静态引入的应用程序启动后,立即静态引入DLL的过程或函数。如果此的过程或函数。如果此DLL不存在,那么程序刚启动就提示错误,并终止程序的运行。不存在,那么程序刚启动就提示错误,并终止程序的运行。2.动态引入不必在应用程序启动时立即静态引入动态引入不必在应用程序启动时立即静态引入DLL,可在程序运行的必要时刻,动态引入,可在程序运行的必要时刻,动态引入DLL。动态方式不仅灵活,而且较为安全。缺陷是:若。动态方式不仅灵活,而且较

7、为安全。缺陷是:若DLL文件较大,且引入时为首次引导加载,则影响运行速度。文件较大,且引入时为首次引导加载,则影响运行速度。7.2 Windows API及其函数及其函数 一、一、Windows API函数分类函数分类 二、二、API函数调用函数调用一、一、Windows API函数分类函数分类 Windows API由其定义的数据结构、常量和数百个函数组成,它们分布于由其定义的数据结构、常量和数百个函数组成,它们分布于Windows提供的众多动态链接库中。根据提供的众多动态链接库中。根据API函数的来源以及函数的来源以及Delphi所定义的相对应单元,可将所定义的相对应单元,可将API函数做

8、出如表函数做出如表7-3的划分。的划分。二、二、API函数调用函数调用Delphi中已经定义了相应的单元,给出了所有中已经定义了相应的单元,给出了所有Windows API函数的编程接口,因此可以在函数的编程接口,因此可以在Delphi程序中直接调用程序中直接调用API函数。虽然函数。虽然API函数调用就是函数调用就是DLL调用,但在调用,但在Delphi中调用中调用API函数非常简单,不需要声明外部引入,只需在函数非常简单,不需要声明外部引入,只需在Uses保留字后声明相应的单元即可。保留字后声明相应的单元即可。DLL引入的操作定义已由引入的操作定义已由Delphi预先定义的单元完成。预先定

9、义的单元完成。7.3 消息处理消息处理 一、一、Windows的消息机制的消息机制 二、二、Delphi的消息处理的消息处理 三、发送消息三、发送消息 四、响应消息四、响应消息一、一、Windows的消息机制的消息机制 Windows并不通知应用程序应该完成什么工作,而是通知应用程序发生了什么事情,这便是所谓的消息,然后,由截获消息的应用程序自己决定如何去处理这些事件。并不通知应用程序应该完成什么工作,而是通知应用程序发生了什么事情,这便是所谓的消息,然后,由截获消息的应用程序自己决定如何去处理这些事件。一个应用程序一旦启动,一个应用程序一旦启动,Windows便为该应用程序建立一个消息队列(

10、便为该应用程序建立一个消息队列(message queue),开始且陆续地将与该应用程序有关的消息加入它的队尾。应用程序则要逐个地将其消息队列中的队头消息取出,筛选出有用的消息,再指派给某个窗口过程,由其对消息进行处理和做出响应。从某种意义上讲,),开始且陆续地将与该应用程序有关的消息加入它的队尾。应用程序则要逐个地将其消息队列中的队头消息取出,筛选出有用的消息,再指派给某个窗口过程,由其对消息进行处理和做出响应。从某种意义上讲,Windows的应用程序不过是一个消息处理器。事件就是被消息所驱动的。每个应用程序内部必定有一段循环程序,负责检索其消息队列,的应用程序不过是一个消息处理器。事件就是

11、被消息所驱动的。每个应用程序内部必定有一段循环程序,负责检索其消息队列,这段特殊的程序称为消息循环这段特殊的程序称为消息循环(message loop)。消息的数据结构在消息的数据结构在Windows中被定义为如下的记录类型:中被定义为如下的记录类型:TMessage=recordMsg:Cardinal;WParam:Word;LParam:Longint;Result:Longint;end;消息定义为如下的消息定义为如下的TMsg记录类型:记录类型:TMsg=packed recordhwnd:HWND;message:UINT;wParam:WPARAM;lParam:LPARAM;t

12、ime:DWORD;pt:TPoint;end;二、二、Delphi的消息处理的消息处理三、发送消息三、发送消息下列两个下列两个Windows API函数均可实现消息的发送。函数均可实现消息的发送。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.覆盖组件继承的虚拟方法覆盖组件继承的虚拟

13、方法WndProcprocedure TNewComponent.WndProc(varmessage:TMessage);beginif message.Msg=需要过滤的消息需要过滤的消息 thenbegin/此处编写处理过滤消息代码此处编写处理过滤消息代码exit;end;inherited WndProc(message);dispatch(message);end;2.覆盖组件继承的虚拟方法覆盖组件继承的虚拟方法DefaultHandler在继承类中对在继承类中对DefaultHandler过程进行覆盖,同样可以实现类似于前一种方法的消息过滤。过程进行覆盖,同样可以实现类似于前一种方

14、法的消息过滤。3.自定义消息和消息处理方法自定义消息和消息处理方法Windows预定义了预定义了1024个编码从个编码从$0000到到$03FF的消息常量标识符,留出从的消息常量标识符,留出从$0400到到$7FFF的编码空间用于用户自定义消息。其中的的编码空间用于用户自定义消息。其中的$0400已定义为已定义为WM_USER。因此,自定义消息常量标识符的形式如下:。因此,自定义消息常量标识符的形式如下:constWM_UserMsgName=WM_USER+N;/其中,其中,0=N=317434.TApplication的的OnMessage事件每当应用程序从消息队列中检索到一个消息时,便触

15、发事件每当应用程序从消息队列中检索到一个消息时,便触发Application的的OnMessage事件。由此,在消息被派送到对其响应和处理的目标对象之前,有机会处理该消息。事件。由此,在消息被派送到对其响应和处理的目标对象之前,有机会处理该消息。7.4 多线程编程多线程编程 一、进程与线程一、进程与线程 二、二、TThread类类 三、创建线程类三、创建线程类 四、线程的优先级与线程调度四、线程的优先级与线程调度 五、线程的挂起、恢复和终止五、线程的挂起、恢复和终止 六、线程的协调六、线程的协调一、进程与线程一、进程与线程在在Windows操作系统中,可以同时运行多个程序,甚至可以启动一个程序

16、的多个实例,此即所谓的多任务。可见,静态的程序与在计算机中运行的程序是有区别的。为明确概念,特将载入内存准备执行的应用程序称为进程。操作系统中,可以同时运行多个程序,甚至可以启动一个程序的多个实例,此即所谓的多任务。可见,静态的程序与在计算机中运行的程序是有区别的。为明确概念,特将载入内存准备执行的应用程序称为进程。进程由下列部分组成:进程由下列部分组成:一个私有的、一个私有的、4GB大小的虚拟地址空间;大小的虚拟地址空间;程序相关的代码和数据;程序相关的代码和数据;操作系统分配给进程的系统资源,如文件、单独的消息队列、同步对象等;操作系统分配给进程的系统资源,如文件、单独的消息队列、同步对象

17、等;至少包含一个线程,这个线程称为主线程,通过它可以创建或控制其他线程。至少包含一个线程,这个线程称为主线程,通过它可以创建或控制其他线程。进程本身并不直接执行代码,进程内的基本执行单元是线程。一个进程可以包含多个线程,每个线程都可以独立运行,并保持各自的堆栈和寄存器的值。一个线程可以控制另一个线程的执行,一个进程内的各个线程共享该进程的虚拟空间和系统资源。而不同进程之间则互不干扰。进程本身并不直接执行代码,进程内的基本执行单元是线程。一个进程可以包含多个线程,每个线程都可以独立运行,并保持各自的堆栈和寄存器的值。一个线程可以控制另一个线程的执行,一个进程内的各个线程共享该进程的虚拟空间和系统

18、资源。而不同进程之间则互不干扰。二、二、TThread类类TThread类封装了类封装了Windows API和和System单元中有关线程运用的函数和例程。与单元中有关线程运用的函数和例程。与VCL中一般的类不同的是:中一般的类不同的是:TThread类是一个抽象类,其所带方法是虚拟抽象的,因而不能直接创建类是一个抽象类,其所带方法是虚拟抽象的,因而不能直接创建TThread的对象实例,而必须先声明一个由的对象实例,而必须先声明一个由TThread继承来的线程类,再利用这个派生类创建线程对象实例和操纵线程具体类的属性和方法。继承来的线程类,再利用这个派生类创建线程对象实例和操纵线程具体类的属

19、性和方法。1.TThread类的属性类的属性Suspended属性、属性、Terminated属性、属性、Priority属性、属性、FreeOnTerminate属性、属性、ReturnValue属性。属性。2.TThread类的方法类的方法Create 方 法、方 法、Execute 方 法、方 法、Suspend 方 法、方 法、Resume方法、方法、Terminate方法、方法、DoTerminate方法、方法、Synchronize方法、方法、WaitFor方法方法3.TThread类的事件类的事件TThread仅定义了一个仅定义了一个OnTerminate事件,当线程对象运行终止

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

21、优先级的线程将抢在低优先级线程之前运行。无论低优先级线程的运行正处在其时间片的什么时候,若操作系统发现一个高优先级的线程准备要运行,便立即暂停低优先级线程的运行,而将一个完整的时间片分配给高优先级线程。时间片优先分配给优先级高的线程,高优先级的线程将抢在低优先级线程之前运行。无论低优先级线程的运行正处在其时间片的什么时候,若操作系统发现一个高优先级的线程准备要运行,便立即暂停低优先级线程的运行,而将一个完整的时间片分配给高优先级线程。32位的位的Windows系统便是采取这种抢先式的线程调度方式。系统便是采取这种抢先式的线程调度方式。五、线程的挂起、恢复和终止五、线程的挂起、恢复和终止何时挂起

22、和唤醒线程主要由操作系统负责调度。然而,应用程序可以使用何时挂起和唤醒线程主要由操作系统负责调度。然而,应用程序可以使用TThread类的类的Suspend方法挂起线程,暂停其执行,使用方法挂起线程,暂停其执行,使用Resume方法唤醒线程,恢复其运行。线程可以自己挂起,但不能自己恢复运行,必须由其他线程恢复它的运行。线程的Execute方法代码执行结束时,即意味着线程的终止,线程自动退出。方法唤醒线程,恢复其运行。线程可以自己挂起,但不能自己恢复运行,必须由其他线程恢复它的运行。线程的Execute方法代码执行结束时,即意味着线程的终止,线程自动退出。六、线程的协调六、线程的协调1.线程互斥

23、线程互斥VCL中提供了中提供了3种解决线程互斥的方法。(种解决线程互斥的方法。(1)锁定对象()锁定对象(2)设置临界段()设置临界段(3)共享读与独占写)共享读与独占写2.线程同步一个线程需要等待其他线程的任务结束才能继续,那么可以暂时挂起线程。有下列两种情况:(线程同步一个线程需要等待其他线程的任务结束才能继续,那么可以暂时挂起线程。有下列两种情况:(1)等待其他线程终止()等待其他线程终止(2)等待一个作业完成)等待一个作业完成7.5 文件访问文件访问 一、一、Pascal方式的文件访问方式的文件访问 二、二、Windows API方式的文件访问方式的文件访问一、一、Pascal方式的文

24、件访问方式的文件访问Delphi中保留了中保留了Turbo Pascal传统的文件概念和标准的文件输入和输出子程序(定义于传统的文件概念和标准的文件输入和输出子程序(定义于System单元,引用时不必声明)。对文件的访问,一般按照如下步骤进行:(单元,引用时不必声明)。对文件的访问,一般按照如下步骤进行:(1)声明文件变量的类型。()声明文件变量的类型。(2)将文件变量与外部文件关联起来。()将文件变量与外部文件关联起来。(3)打开文件。()打开文件。(4)读、写文件。()读、写文件。(5)文件定位。()文件定位。(6)关闭文件。)关闭文件。二、二、Windows API方式的文件访问方式的文

25、件访问Delphi的的SysUtils单元封装了单元封装了Windows提供的文件输入提供的文件输入/输出的输出的API函数,以及默认参数的常量定义。这些函数,以及默认参数的常量定义。这些API函数的函数的Pascal语法定义如表语法定义如表7-8所示。与传统的所示。与传统的Pascal文件访问方式相比,文件句柄方式在打开文件时提供了更多的可选参数,如设置与网络共享有关的的参数等,文件定位方式也较为灵活。然而,传统的文件访问方式相比,文件句柄方式在打开文件时提供了更多的可选参数,如设置与网络共享有关的的参数等,文件定位方式也较为灵活。然而,传统的Pascal方式由于可以定义有类型(读写数据元素的类型)的文件,读写数据部分的程序编写较为简方式由于可以定义有类型(读写数据元素的类型)的文件,读写数据部分的程序编写较为简洁洁。

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

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com