Delphi 中的DLL 封装和调用对象技术
本文刊登2003 年10 月份出版的Dr.Dobb's 软件研发第3 期
刘 艺
摘 要
DLL 是一种应用最为广泛的动态链接技术但是由于在DLL 中封装和调用对象受到对
象动态绑定机制的限制使得DLL 在封装对象方面有一定的技术难度导致有些Delphi 程
序员误以为DLL 只支持封装函数不支持封装对象本文着重介绍了DLL 中封装和调用对
象的原理和思路并结合实例给出了多种不同的实现方法
关键字动态链接库DLL 对象接口虚方法动态绑定类引用面向对象
1 物理封装与动态链接
物理上的封装意味着将程序封装成若干个独立的物理组成部分各部分之间通过动态链
接共同完成系统的功能而且各个物理组成部分可以单独维护和编译不影响其他部分要
理解物理封装首先要搞清楚静态链接和动态链接
在Delphi 中如果程序的各个模块分别保存在不同的单元文件中并通过uses 指令来
互相调用这就是一个典型的静态链接于是各个静态的子例程编译之后连接器从Delphi
编译过的单元或静态库中取出子例程编译代码并添加到执行文件中最终EXE 文件包
括了程序及其所属单元的所有代码显然静态链接的单元或模块最终以一个独立的物理形
式可执行文件存在除了自己编写的单元文件Delphi 还自动uses 了一些预设的单元
如Windows Messages 等这些都是静态链接
静态链接无法实现物理上的切割和封装而且一旦其中某个单元或模块改动其他所有
单元或模块都得随之重新编译和连接
用于实现物理切割和封装的bpl 包DLL 动态链接库或COM+组件都是一种动态链接
的形式在动态链接情况中连接器只使用子例程external 声明中的信息在执行文件中产生
一些数据表格当Windows 向内存中装载执行文件时它首先装载所有必需的DLL 然后
程序才会启动在装载过程中Windows 用函数在内存中的地址填充程序的内部表格
每当程序调用一个外部函数时它就会使用该内部数据表格直接对DLL 代码它当前
装载在程序的地址空间中进行调用注意该模式不会涉及两个不同的应用程序DLL
已经变成了应用程序的一部分并装载在同一地址空间所有参数的传递都发生在堆栈上
与其它任何函数调用一样这里我们不打算讨论DLL 的编译因为我们首先想重点介绍
Delphi 中的DLL 封装和调用对象技术
2 用DLL 封装对象
DLL Dynamic Link Library 动态链接库就目前来讲已经不再是什么新技术读者可
以在书店过时的Delphi 书籍里随便找到讨论DLL 编程的章节但这些涉及DLL 编程的书
中几乎都是谈论用DLL 来封装函数的实际上大量的程序员也是在使用DLL 来封装函数
或面向过程的一个模块一个函数集合而在这里我只想讨论如何用DLL 来封装对象
这可能是读者未曾有过的DLL 使用经验但这却是这本完全围绕面向对象编程的书中重要
的部分之一或许你能从中发现一些与众不同的实用技巧
参见考虑到目前关于DLL的现成资料很多这里我省略了DLL的基本知识和编写
方法假设读者已经有了一定的DLL编程基础如果你没有这样的基础建议参阅
拙作Delphi6企业级解决方案及应用剖析DLL编程技术一节P271
一般来说使用DLL 封装对象主要有以下好处

Delphi 中的DLL 封装和调用对象技术(刘艺,有截图)的更多相关文章

  1. 使用jdbc将mysql数据库中的内容封装为指定对象的list集合

    使用jdbc将mysql数据库中的内容封装为指定对象的list集合 public List<User> findAll() { private JdbcTemplate template ...

  2. 多个类的DLL封装及调用

    #define FaceLIBDLL #include "stdafx.h" #include "facedll.h" #include <opencv2 ...

  3. 在eclipse中API的封装和调用

    自己写的API的封装和调用:1.写好api的方法的实现类.2.抽取一个javadoc文档.file->Export->java->javadoc->finish->Yes ...

  4. Python中的7种可调用对象

    Python中有七种可调用对象,可调用对象可使用内置函数callable来检测 一.用户自定义的函数: 使用def语句或者lambda表达式创建的函数. 二.内置函数: 使用C语言实现的函数,如len ...

  5. Android 中jar包封装及调用-转

    在android开发过程中,我们经常会有这种需求,自己开发一个类库jar包,提供给别人调用. 即把项目A封装成jar包,供项目B调用,而在项目B中调用项目A的activity的时候问题就出现了:找不到 ...

  6. VB.NET中的DLL编写和调用的最简单示例

    DLL(动态链接库)是一个很有用的东西,在开发大项目的时候显得非常重要,因为多人合作开发时,可以给每个人分配一个任务,用DLL完成,最后组合起来,就不会出现互相冲突的问题.这里给出最简单的DLL编写与 ...

  7. Delphi中一些DLL的运用(要传递Application和Screen,似乎还忘了传递提示控件)

    dll 调用部分: {****************************************************************} { } { Project: DllDebug ...

  8. c# DLL封装并调用

    1.封装自己的dll: a.打开visual studio - 文件 - 新建 - 项目- 类库 - 名称MyTestDll: b.右键Class1.cs - 修改为 TestDll.cs; c.在里 ...

  9. Delphi中的dll操作

    利用delphi dll wizard进行dll的编写. 创建:保存时改dll名称 library test2; uses SysUtils, Classes, forms, dialogs; {$R ...

随机推荐

  1. MongoDB 的分组操作 In C#

    C#对mongodb的分组查询操作,主要通过脚本或Aggregate方法来实现,以下通过一些实例作解析: 参考资料:http://www.tuicool.com/articles/2iqUZj   h ...

  2. Mysql主从配置+读写分离

    Mysql主从配置+读写分离     MySQL从5.5版本开始,通过./configure进行编译配置方式已经被取消,取而代之的是cmake工具.因此,我们首先要在系统中源码编译安装cmake工具. ...

  3. JavaScript高级程序设计(八):基本概念--操作符

    操作符包括:算术操作符.位操作符.关系操作符和相等操作符. 一元操作符 1.只能操作一个值得操作符,即递增和递减操作符: 2.递增(++)和递减(--)操作符包括:前置型和后置型.前置型位于要操作的变 ...

  4. 利用css3动画和border来实现圆形进度条

    最近在学习前端的一些知识,发现border的功能十分强大啊! 首先来看看demo 就是这么一个圆形的进度条,在文本框中输入0-100的数值下面的进度条相应的转到多少 这个主要是利用border,旋转和 ...

  5. NOIP201501&&02

    NOIP201501金币 试题描述 国王将金币作为工资,发放给忠诚的骑士.第一天,骑士收到一枚金币:之后两天(第二天和第三天) ,每天收到两枚金币:之后三天(第四.五.六天) ,每天收到三枚金币:之后 ...

  6. <<深入Java虚拟机>>-第三章-垃圾收集器与内存分配策略-学习笔记

    垃圾收集 垃圾收集(Garbage Collection,GC),垃圾收集需要完成的三件事情. 哪些对象需要回收 什么时候回收 如何回收 如何确定对象已死(即不可能在被任何途径引用的对象) 引用计数算 ...

  7. OpenCV2学习笔记03:Qt中配置OpenCV环境

    在Qt中开发基于OpenCV的应用时,需要配置对应函数库到环境变量,这时候我们需要使用到qmake能够识别的变量来指定环境变量. INCLUDEPATH: 用于指定搜索头文件到文件夹路径. LIBS: ...

  8. 三个PHP常用代码样例

    作为一个正常的程序员,会好几种语言是十分正常的,相信大部分程序员也都会编写几句PHP程序,如果是WEB程序员,PHP一定是必备的.尽管PHP经常被人诟病,被人贬低,被人当玩笑开,事实证明,PHP是全世 ...

  9. SQL技术内幕三

    Select 分析一个查询实例 Select empid,year(orderdate) as orderYear,count(*) as orderCount From dbo.orderInfo ...

  10. mysql更改默认存储引擎

    在mysql的官网上看到在mysql5.5以上的版本中已经更改了默认的存储引擎,在5.5版本以前是Myisam以后是Innodb. InnoDB as the Default MySQL Storag ...