第十章动态链接库编程一内容摘要:

ExitProc 为 nil。 下边的一段程序包含一个退出过程和一段初始化代码,用来说明如何正确设置退出过程。 library Test。 {$S} uses WinTypes, WinProcs。 var SaveExit: Pointer。 procedure LibExit。 far。 begin if ExitCode = wep_System_Exit then begin { 系统关闭时的相应处理 } end else begin { DLL 卸出时的相应 处理 } end。 ExitProc := SaveExit。 { 恢复原来的退出过程指针 } end。 begin {DLL 的初始化工作 } SaveExit := ExitProc。 { 保存原来的退出过程指针 } ExitProc := @LibExit。 { 安装新的退出过程 } end. 在初始化代码中,首先把原来的退出过程指针保存到一个变量中,而后再把新的退出过程地址赋给 ExitProc。 而在自定义退出过程 LibExit 结束时再把ExitProc 的值恢复。 由于 ExitProc 是一个系统全局 变量,所以在结束时恢复原来的退出过程是必要的。 退出过程 LibExit 中使用了一个系统定义变量 ExitCode,用于标志退出时的状态。 ExitCode 的取值与意义如下: 表 ExitCode 的取值与意义 ━━━━━━━━━━━━━━━━━━━━━ 取 值 意 义 ————————————————————— WEP_System_Exit Windows 关闭 WEP_Free_DLLx DLLs 被卸出 ━━━━━━━━━━━━━━━━━━━━━ 退出过程编译时必须关闭 stack_checking,因而需设置编译指示 {$S}。 编写一般 DLLs 的应用举例 在下面的程序中我们把一个字符串操作的函数储存到一个 DLLs 中,以便需要的时候调用它。 应该注意的一点是:为了保证这个函数可以被其它语言编写的程序所调用,作为参数传递的字符串应该是无结束符的字符数组类型 (即 PChar类型 ),而不是 Object Pascal 的带结束符的 Srting 类型。 程序清单如下: library Example。 uses SysUtils, Classes。 {返回字符在字符串中的位置 } function InStr(SourceStr: PChar。 Ch: Char): Integer。 export。 var Len,i: Integer。 begin Len := strlen(SourceStr)。 for i := 0 to Len1 do if SourceStr[i] = ch then begin Result := i。 Exit。 end。 Result := 1。 end。 exports Instr Index 1 name 39。 MyInStr39。 resident。 begin end. 调用 DLLs 有两种方法可用于调用一个储存在 DLLs 中的过程。 使用一个外部声明子句,使 DLLs 在应用程序开始执行前即被装入。 例如: function Instr(SourceStr : PChar。 Check : Char)。 Integer。 far。 external 39。 UseStr39。 使用这种方法,程序无法在运行时间里决定 DLLs 的调用。 假如一个特定的DLLs 在运行时无法使用,则应用程序将无法执行。 使 用 Windows API 函数 LoadLibray和 GetProcAddress 可以实现在运行时间里动态装载 DLLs 并调用其中的过程。 若程序只在其中的一部分调用 DLLs 的过程,或者程序使用哪个 DLLs, 调用其中的哪个过程需要根据程序运行的实际状态来判断,那么使用动态调用就是一个很好的选择。 使用动态调用,即使装载一个 DLLs 失败了,程序仍能继续运行。 静态调用 在静态调用一个 DLLs 中的过程或函数时, external 指示增加到过程或函数的声明语句中。 被调用的过程或函数必须采用远 调用模式。 这可以使用 far 过程指示或一个 {$F +}编译指示。 Delphi 全部支持传统 Windows 动态链接库编程中的三种调用方式,它们是: ● 通过过程 /函数名 ● 通过过程 /函数的别名 ● 通过过程 /函数的顺序号 通过过程或函数的别名调用,给用户编程提供了灵活性,而通过顺序号(Index)调用可以提高相应 DLL的装载速度。 动态调用 动态调用中的 API 函数 动态调用中使用的 Windows API 函数主要有三个 ,即: Loadlibrary,GetProcAddress 和 Freelibrary。 : 把指定库模块装入内存 语。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。