Delphi 第08章_Windows高级编程_第1页
Delphi 第08章_Windows高级编程_第2页
Delphi 第08章_Windows高级编程_第3页
Delphi 第08章_Windows高级编程_第4页
Delphi 第08章_Windows高级编程_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第8章 Windows 高级编程Delphi 程序设计教程(第3版)清华大学出版社 杨长春 主编8.1.1 动态链接库简介1动态链接库(DLL)简介 动态链接库(DymmicLinkLibrary简称DLL)是一些编译过的可执行程序模块,它包含代码,数据或资源,可以在应用程序或其他DLL中调用动态链接厍的文件扩展名一般为.dll,也可以是.drv(设备驱动程序)、.sys(系统文件)和.fon(字体文件),DLL可以实现多个应用程序共享代码和资源。 8.1 动态链接库编程2动态链接库(DLL)工作原理 使用DLL的动态链接并不是将库代码拷贝,只是在程序中记录了函数的入口点和接口,在程序执行时才

2、将库代码装入内存。所以不管多少程序使用了DLL,内存中都只有该DLL的一个副本。当没有程序使用它时,系统就将它移出内存,减少了对内存和磁盘的要求。 动态连接库属于Windows可执行文件,但它又不是EXE文件,它不像EXE文件那样可以直接执行,DLL文件中包含的可执行代码是由EXE文件调用的。 3动态链接库(DLL)特点 DLL最大的特点就是它的代码在运行期间被动态地链接至调用它的程序中。它不用重复编译或链接,一旦装入内存,DLL函数可以被系统中的任何正在运行的应用程序所使用,他们共享该DLL函数的单一拷贝。 DLL中一般由程序通用的过程、函数等构成,当然也可以包括各种资源。在创建Window

3、s应用程序时,链接过程并不把DLL文件中的例程链接到程序上,只有当EXE文件运行并需要调用一个DLL文件中的函数或过程时,Windows 才在DLL中寻找被调用函数并把它的地址传递给调用程序。 8.1.2 创建DLL 通过Delphi XE8主菜单的【File】|【New】|【Other】在弹出的【New Items】对话框中,选择Dynamic-link Library图标,单击【OK】按钮,系统将自动创建一个DLL项目。 DLL和Application项目文件的格式对比DLL项目文件的主要格式如下:Application项目文件的主要格式如下:Library 项目名; Program 项目

4、名;Uses 子句; Uses 子句;Exports 子句; /数据接口函数 Begin /程序执行体Begin /程序执行体 End.End. DLL项目文件和一般项目文件主要存在两个方面的区别: (1)Application项目文件用Program关键字作程序头,而DLL项目文件用Library关键字作程序头,因此编译器会根据不同的关键字来生成不同的可执行文件。用Program关键字生成的是.exe文件,而Library关键字生成的是.dll文件。(2)第二个区别是DLL提供接口都是Exports关键字来实现的。在DLL项目文件中,将我们想要输出的函数或过程,列在Exports子句中,就可

5、以实现输出了。1Exports关键字的使用用关键字Exports引出函数或过程,表明编译时要使用远程地址调用,使得函数或过程在DLL内可被其他模块访问。Exports有如下几种形式:(1)exports例程名; /名字引出(2)exports例程名 index索引值; /索引值引出index用来指示为一个函数或过程分配一个顺序号,其值的范围是为132767。(3)exports例程名 name 别名; /别名引出name后面接的是字符串常量,用来指出该过程或函数的输出名。(4)exports例程名name别名resident /resident选项 8.1.3 DLL文件的静态调用DLL文件的

6、调用一般有两种方法,即静态调用方法和动态调用方法,静态调用方式,就是在本单元的Interface部分用External指示字列出要从DLL中调用的过程;动态调用方式是通过调用Windows API中的LoadLibrary函数、GetProcAdrress函数和FreeLibrary函数来实现DLL文件的动态调用。1静态调用静态调用又称为隐式加载方式,它是通过单元体中Interface部分的External指示字所列出需要调用DLL文件的过程或函数。这些被指定的DLL文件中的过程是在程序执行之前被加载进内存的。 静态调用方式在使用DIL中的函数或过程之前,先引入DLL中的函数或过程。引入DLL

7、中的例程一般有三种方法:(1)通过过程名或函数名来调用: function funcName(参数):DataType;tdcall;external DLL文件名 (2)通过过程或函数的别名来调用: function funcName(参数):DataType;stdcall;external DLL文件名 name 别名(3)通过过程或函数的索引来调用:function funcName(参数):DataType;stdcall;external DLL文件名 index n在Delphi XE8中,存在一个调用约定的问题。调用约定就是指调用例程时参数的传递顺序。 在Delphi XE8中

8、DLL支持的调用约定如表所示。使用静态调用方式,有两个缺点:一是当要加载的DLL文件不存在或者没有指定调用的过程时,程序就会自动停止运行,或可能致使程序出错;二是一旦所需的DLL文件被加载至内存后,即使不再需要,其仍然停留在应用程序的地址空间中。 调用约定 参数传递顺序 Register 从左到右 pascal 从左到右 Stdcall 从右到左 Cdecl 从右到左 Safecall 从右到左 8.1.4 DLL文件的动态调用1动态调用动态调用又称为显示加载方式,它可以解决静态调用中存在的局限性。动态调用不需要在单元体Interface部分中把需要调用的所有DLL过程都列出,其只要在调用前引

9、用,并且使用LoadLibrary函数指定需要加载的DLL文件,使用GetProcAddress函数指定所调用的过程或函数,并返回该过程或函数的入口地址,使用FreeLibrary函数实现将该函数从内存中移除。此外,如果指定的DLL文件出错,不会导致程序终止运行。 动态调用DLL主要用到三个Win32 API函数:LoadLibrary()、FreeLibrary()、GetProcAddress()。 (1) Loadlibrary(): 把指定库模块装入内存其使用的语法为:function Loadlibrary(LibFileName: PChar): THandle;LibFileNa

10、me指定了要装载DLL的文件名,如果LibFileName没有包含一个路径,则Windows按下述顺序进行查找:当前目录;Windows目录;Windows系统目录;包含当前任务可执行文件的目录。列在PATH环境变量中的目录以及网络的映象目录列表。如果函数执行成功,则返回装载库模块的实例句柄。 (2) GetProcAddress:取得给定模块中函数的地址语法为:function GetProcAddress(Module: THandle; ProcName: PChar): TFarProc; Module包含被调用的函数库模块的句柄,这个值由Loadlibrary返回。如果把Module

11、设置为nil,则表示要引用当前模块。(3)Freelibrary():从内存中移出库模块语法为:procedure Freelibrary(Module : THandle); Module为库模块的句柄。这个值由Loadlibrary返回。由于库模块在内存中只装载一次,因而调用Freelibrary首先使库模块的引用计数减一。如果引用计数减为0,则卸出该模块。每调用一次Loadlibrary就应调用一次FreeLibray,以保证不会有多余的库模块在应用程序结束后仍留在内存中。8.2.1 创建ActiveX控件Button(1)从Delphi XE8菜单中选择打开【File】|【New】|【

12、Other】命令打开 【NewItems】对话框,翻到ActiveX页,然 后 选 择 ActiveXControl图标 。图8-4 New Items对话框的“ActiveX”页8.2 ActiveX编程(2)单击OK按钮,显示ActiveX控制向导 。在【VCL Class Name】框内选择组件模板上的一个可视组件,然后在【New ActiveX Name】框内输入要创建的ActiveX控件名,通常最后一个字母是大写的X。也可以接受缺省的控件名。在【VCL Class Name】列表框中并没有包还所有的VCL控件,只有符合下面三个条件的VCL控件才会被列出来。一是该VCL控件必须已经安装

13、到了组件面板上;二是该控件必须继承于TwinControl;最后一个条件是该控件没有调用过RegiserNonActiveX()。 在【Implementation Unit】中显示ActiveX实现的单元名称。在【Threading Model】中显示用于选择线程的模式,可以选择Apartment,free,single或both。(3)单击OK按钮。Delphi XE8将创建下面的文件:ActiveX项目文件:ButtonXControl1.DPR类型库文件:ButtonXControl1.TLB类型库的接口源文件:ButtonXControl1_TLB.pasActiveX接口实现单元文

14、件:ButtonImpl1.PAS8.2.2添加新属性要给接口增加属性或方法,需要用【View】|【Type Library】|【Type Library】编辑器,同时在IButtonX上单击鼠标右键,选择 【New】|【Property】。单击该菜单项后,将弹出如图所示的对话框。 添加属性Mycaption,其Type(数据类型)选择BSTR。可以看到在左侧的树型列表框中增加了两个Mycaption。 通过查看ButtonXControl1_TLB.pas文件,可以在IbuttonX接口的声明中看到这样的声明:property Mycaption: WideString read Get_M

15、ycaption write Set_Mycaption;其中Get_Mycaption和Set_Mycaption是属性Mycaption的访问方法 。 选择【Project】| 【Build ButtonXControl1】命令,就可以生成ButtonXControl1.ocx文件。此时可选择【Run】| 【Register ActiveX Server】将它注册到系统注册表中。 注册以后,就可以在【Import ActiveX Control】对话框中的组件表中看到它了。该对话框可以通过【component】|【import component】打开 ,如果没有先注册【ActiveX】控制,则在组件列表中看不到它,可以单击【Add.】按钮将其加进来 。8.2.3 ActiveX的使用在下列两种情况下考虑使用ActiveX控件:1没有合适的Delphi XE8组件可以使用时。2想使用多种编程语言进行开发,想在多个开发平台间共享一些控件时。把ActiveX控件安装到Delphi XE8组件面板的步骤如下:1点击菜单【component】|【import activex control】 。2新窗口的上半部显示了在系统中已经注册过的ActiveX控件的列表。如果该ActiveX控件还没有注册,单击【ADD】,然后

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论