知识大全 动态链接库编程(一)[2]

Posted 过程

篇首语:黑暗带来恐惧。知识可以点亮你,驱逐恐惧。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 动态链接库编程(一)[2]相关的知识,希望对你有一定的参考价值。

DELPHI基础教程:动态链接库编程(一)[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

   DLLs中的变量和段

  一个DLLs拥有自己的数据段(DS) 因而它声明的任何变量都为自己所私有 调用它的模块不能直接使用它定义的变量 要使用必须通过过程或函数界面才能完成 而对DLLs来说 它永远都没有机会使用调用它的模块中声明的变量

  一个DLLs没有自己的堆栈段(SS) 它使用调用它的应用程序的堆栈 因此在DLL中的过程 函数绝对不要假定DS = SS 一些语言在小模式编译下有这种假设 但使用Delphi可以避免这种情况 Delphi绝不会产生假定DS = SS的代码 Delphi的任何运行时间库过程/函数也都不作这种假定 需注意的是如果读者想嵌入汇编语言代码 绝不要使SS和DS登录同一个值

   DLLs中的运行时间错和处理

  由于DLLs无法控制应用程序的运行 导致很难进行异常处理 因此编写DLLs时要十分小心 以确保被调用时能正常执行 当DLLs中发生一个运行时间错时 相应DLLs并不一定从内存中移去(因为此时其它应用程序可能正在用它) 而调用DLLs的程序异常中止 这样造成的问题是当DLLs已被修改 重新进行调用时 内存中保留的仍然可能是以前的版本 修改后的程序并没有得到验证 对于这个问题 有以下两种解决方法

   在程序的异常处理部分显式将DLL卸出内存

   完全退出Windows 而后重新启动 运行相应的程序

  同一般的应用程序相比 DLL中运行时间错的处理是很困难的 而造成的后果也更为严重 因此要求程序设计者在编写代码时要有充分 周到的考虑

   库初始化代码的编写

  传统Windows中动态链接库的编写 需要两个标准函数 LibMain和WEP 用于启动和关闭DLL 在LibMain中 可以执行开锁DLL数据段 分配内存 初始化变量等初始化工作 而WEP在从内存中移去DLLs前被调用 一般用于进行必要的清理工作 如释放内存等 Delphi用自己特有的方式实现了这两个标准函数的功能 这就是在工程文件中的begin…end部分添加初始化代码 和传统Windows编程方法相比 它的主要特色是

   初始化代码是可选的 一些必要的工作(如开锁数据段)可以由系统自动完成 所以大部分情况下用户不会涉及到

   可以设置多个退出过程 退出时按顺序依次被调用

   LibMain和WEP对用户透明 由系统自动调用

  初始化代码完成的主要工作是

   初始化变量 分配全局内存块 登录窗口对象等初始化工作 在( )节 利用DLLs实现应用程序间的数据传输 中 用于数据共享的全局内存块就是在初始化代码中分配的

   设置DLLs退出时的执行过程 Delphi有一个预定义变量ExitProc用于指向退出过程的地址 用户可以把自己的过程名赋给ExitProc 系统自动调用WEP函数 把ExitProc指向的地址依次赋给WEP执行 直到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 := to Len do

  if SourceStr[i] = ch then

  begin

  Result := i;

  Exit;

  end;

  Result := ;

  end;

  exports

  Instr Index name MyInStr resident;

  begin

  end

   调用DLLs

  有两种方法可用于调用一个储存在DLLs中的过程

cha138/Article/program/Delphi/201311/25208

相关参考

知识大全 动态链接库编程(一)[3]

DELPHI基础教程:动态链接库编程(一)[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 动态链接库编程(一)[1]

DELPHI基础教程:动态链接库编程(一)[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 动态链接库编程(二)[2]

DELPHI基础教程:动态链接库编程(二)[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 动态链接库编程(二)[3]

DELPHI基础教程:动态链接库编程(二)[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 动态链接库编程(二)[4]

DELPHI基础教程:动态链接库编程(二)[4]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 动态链接库编程(二)[1]

DELPHI基础教程:动态链接库编程(二)[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 Delphi 中动态链接库(dll)的建立和使用[2]

Delphi中动态链接库(dll)的建立和使用[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 在VC中链接动态链接库的方法简要说明

在VC中链接动态链接库的方法简要说明  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!方法一windo

知识大全 Delphi中动态链接库两种调用方式的比较

Delphi中动态链接库两种调用方式的比较  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!一动态链接

知识大全 LINUX系统中动态链接库的创建与使用

LINUX系统中动态链接库的创建与使用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  大家都知道