使用DLL有若干理由,其中有一些前面提到过的。大体说来,使用动态链接库可以共享代码、系统资源,可以隐藏实现的代码或底层的系统例程、设计自定义控件

一、共享代码、资源和数据

  前面已经提到,共享代码是创建动态链接库的主要目的所在。但与单元的代码共享不同,DLL的代码可以被任何Windows 应用程序共享,而单元代码的工现象局限于Delphi应用程序

  另外,DLL提供了共享资源的途径,诸如 位图、字体、图标等等这些都可以放到一个资源文件中,并直接链接到应用程序。如果把这些资源放到DLL中,那么就可以让许多引用程序使用,而不必在内存中重复装入这些资源。

  在16位的Windows 中,DLL有自己的数据段,于是,所有要调用同一个DLL的应用程序能够访问同一个全局变量和静态变量。但是在Win 32系统中,这就不同了。因为DLL的映像被映射到每个进程的地址空间,该DLL的所有数据属于映射到的进程。值得一说的是,尽管进程间不能共享DLL的数据,但是同一个进程的所有线程可以共享,因为线程是相互独立的,所以在访问某一DLL的全局变量时,务必小心,防止引起冲突。

  一定要理解:如果有多个程序都去加载同一个DLL,那么每个程序都会在自己的内存空间里面复制一份DLL(或者说:DLL的映像被映射到每个进程的地址空间),不会是多个程序共用一个DLL,所以多个加载DLL的程序需之间不会因为都加载一个DLL而有任何的联系和冲突(可能也有一些很特殊的情况下会造成冲突,那时候就需要注意了,不过目前我还没有了解到,等到以后遇到了再去整理吧!)。大家都是将DLL复制到自己的内存空间,然后各自执行各自的。

  但是这并不意味着没有办法实现在进程间共享一个DLL的数据。一个技术可以通过内存映射文件的方法在内存中创建一个共享的区域。一切需调用DLL的应用程序都可以读这些存储在内存中的共享区域中的数据

二、隐藏实现的细节

  有时候,你可能想隐藏例程实现的细节,DLL就可以实现这一点,不管为什么要隐藏你的代码,DLL可以使函数被应用程序访问,而其中的代码细节不被显现,你所要做的只是提供别人能访问DLL的接口。你也许认为Delphi的便于单元(DCU)也可以实现隐藏细节,但是DCU只适用于Delphi应用程序,而且还受版本的局限。而DLL与语言无关,所以,创建的DLL可以被C++、VB或者其他支持DLL的语言调用。

  Windows单元是Win32 DLL的接口单元。Delphi 5提供了Win32 API的源文件,其一是Windows单元的源文件windows.pas,在该文件的interface部分有如下的定义

function ClientToScreen(Hwnd: HWND; var lpPoint: TPoint): BOOL; stdcall;

  为连接到相应的DLL,在其implementation部分,有如下的例子

function ClientToScreen; external user32 name 'ClientToScreen';

  这行代码的意思表明,ClientToScreen() 在动态链接库 User32.dll中,它的名称叫 ClientToScreen

三、自定义控件

  自定义控件通常放在DLL中。这些控件不同于Delphi的自定义组件。自定义控件是在Windows 下注册,并且可以在任何Windows开发环境中使用。将这些类型的自定义控件加进DLL中,是考虑到即使有多个应用程序要使用这些自定义控件,内存中也只有该控件的一份实例

  注意:其实将自定义控件加入到DLL这种机制已经过时,现在微软使用 OLE和ActiveX控件自定义控件已经很少见了

Delphi之DLL知识学习3---为什么要使用DLL的更多相关文章

  1. Delphi之DLL知识学习1---什么是DLL

    DLL(动态链接库)是程序模块,它包括代码.数据或资源,能够被其他的Windows 应用程序共享.DLL的主要特点之一是应用程序可以在运行时调入代码执行,而不是在编译时链接代码,因此,多个应用程序可以 ...

  2. Delphi之DLL知识学习4---创建DLL

    下面是在Delphi中创建一个DLL的全过程,你将看到怎样创建一个接口单元,使之可以被其他的应用程序访问.并且将学会怎么把Delphi的窗体加入DLL中. 一.数美分:一个简单的DLL 下面是包含一个 ...

  3. Delphi之DLL知识学习2---静态链接和动态链接

    静态连接 静态链接是指Delphi 编译器把要调用的函数和过程编译成可执行代码.函数的代码可存留在应用程序的 .dpr文件或一单元中.当链接用户的应用程序时,这些函数与过程便成为最终的可执行文件的一部 ...

  4. Delphi之DLL知识学习5---在Delphi应用程序中使用DLL

    首先说明一下:同一个动态库(DLL)被多个的程序加载的话,那么将会在每次加载的时候都会重新分配新的独立的内存空间,绝对不是共用一个,所以当一个DLL被多次加载的时候,其会在内存中“复制”多份,不会互相 ...

  5. 网络知识学习2---(IP地址、子网掩码)(学习还不深入,待完善)

    紧接着:网络知识学习1 1.IP地址    IP包头的结构如图 A.B.C网络类别的IP地址范围(图表) A.B.C不同的分配网络数和主机的方式(A是前8个IP地址代表网络,后24个代表主机:B是16 ...

  6. 【Delphi内联汇编学习1】Delphi与汇编

    我一直认为Delphi功能与C++相比毫不逊色,提供了丰富的控件和类.全部API以及嵌入的汇编.最近小弟在把C版的Huffman压缩改用Delphi写时,顺便“研究”了一下Delphi的位操作和嵌入式 ...

  7. 关于DLL的学习

    1.前言: 人总归还是要有梦想的,不然跟咸鱼有什么区别.这一周给自己定下了研究DLL的任务还是要逼自己完成的呀,上了一天的党校,游戏也不打在这里写博,心疼自己.话说为什么要给自己下这样一个任务呢,是因 ...

  8. HTML5标签汇总及知识学习线路总结

    HTML5标签汇总,以及知识学习线路总结.

  9. 安全测试3_Web后端知识学习

    其实中间还应该学习下web服务和数据库的基础,对于web服务大家可以回家玩下tomcat或者wamp等东西,数据库的话大家掌握基本的增删该查就好了,另外最好掌握下数据库的内置函数,如:concat() ...

随机推荐

  1. ACM-括号匹配问题

    对ACM仰慕已久,无奈今天才开始.好吧,遇到的第二个题目就把我难到了.(实话是第一个) 进入正题,下面Copy出题目:  现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0 ...

  2. am335x 1G nand 启动Linux qt

    针对DRAM的升级,修改u-boot 的参数即可. include/configs/ok335x.h 修改PHYS_DRAM_1_SIZE 为0x40000000  这是1G的大小. 原来512M 为 ...

  3. BZOJ 1485: [HNOI2009]有趣的数列

    Description 求长度为 \(2n\) 的序列.要求 1. \(a_1<a_3<a_5<...<a_{2n-1}\) . 2. \(a_2<a_4<a_6& ...

  4. Python自动化之线程进阶篇(二)

    queue队列 class queue.Queue(maxsize=0) #先入先出 class queue.LifoQueue(maxsize=0) #后入先出 class queue.Priori ...

  5. Linux nohup 程序后台运行

    &方式: Unix/Linux下一般想让某个程序在后台运行,很多都是使用 & 在程序结尾来让程序自动运行.比如我们要运行mysql在后台:          /usr/local/my ...

  6. 9.2---机器人走方格(CC150)

    这题就是dp的一般题目 public static int countWays(int x, int y){ if( x < 0 || y < 0) return -1; int[][] ...

  7. Tomcat 7最大并发连接数的正确修改方法

    这是个很简单的问题,但是搜了一圈,发现大家都写错了.所以这里总结一下: 几乎所有的中文网页都介绍,要修改Tomcat的默认最大并发连接数,应该进行如下设置(实际上这些步骤是错误的): -------- ...

  8. JavaScript——特殊点总结

    首先,== equality 等同,=== identity 恒等. ==, 两边值类型不同的时候,要先进行类型转换,再比较. ===,不做类型转换,类型不同的一定不等. 下面分别说明: 先说 === ...

  9. iOS 串行网络请求。。。待研究

    nsurlsession 和 nsurlconnection 能实现吗? 手动实现的关键点在哪里? 我这里说的串行网络请求,指的是第一个网络请求不返回数据,第二个网络请求就不能开始. AFNetwor ...

  10. jquery checkbox 限制多选的个数

    2015年11月6日 16:32:49 选中第四个的时候提示超过了3个, 点解alert框取消后, 将最后一个选中的checkbox取消选中 <script> $(document).re ...