zoukankan      html  css  js  c++  java
  • 为什么使用DLL

    (1) 如果不同的程序使用相同的 DLL,只需将 DLL 在内存中装载一次,这样节省了系统内存。DLL 映射到每个进程(每运行一次应用程序)的专用地址空间中,但它们的代码使用的内存影像程序只在内存中装载一次。
     
    (2) 可以提供 DLL 的不同版本,代替当前的 DLL。如果 DLL 中的子例程有相同的参数,可以用新版本的 DLL 运行程序,而不需要重新编译它。如果 DLL 有新的子例程,它根本不会有什么影响。只有当新版本 DLL 中缺少老版本 DLL 中的子例程时,才可能出现问题。
     
    (3) DLL 作为一种基于 Windows 的程序模块,不仅可以包含可执行代码,还可以包括数据和各种资源等,扩大了库文件的使用范围。有些设备驱动程序也是由动态链接库实现的(扩展名一般是 DRV)。
     
    (4) DLL 技术对于开发大型软件系统也有可用之处。一个大型系统,如果用一个执行文件完成,程序将很庞大,而且可能有许多重复的功能。如果将程序分成一系列的主程序和DLL,可以减少开发的工作量。而且由于每个模块减小了,访问的速度也提高了。
     
    (5) DLL 另一个用途是支持世界各国的语言。开发者可以将依赖于语言的函数和资源分离出来,专门放进 DLL 中,例如中文、英文、法文等。各地使用软件的用户可以安装或运行适当的 DLL,以获取正确的本地信息。这是实现软件商品国际化的一项技术。
     
    (4) 将一些功能模块做成 DLL 后,如果需要对系统进行升级,只要将个别 DLL 进行升级,然后用新的 DLL 文件覆盖掉旧的 DLL 文件即可,而不需要将整个系统进行重新编译和链接。
     
    (5) DLL 给程序开发带来了很多灵活性。例如,一件工作有许多方法可以完成,可以将这些方法利用 DLL 实现。当以后新增加了方法后,将新方法也用 DLL 实现,然后只要对原来的工程文件做少量的修改即可。
     
    (6) DLL 还独立于编程语言。例如,在 Delphi 环境中开发的 DLL 程序可以在 Visual C++环境中方便地使用;同时,在 Delphi 环境中也可以方便地使用在 Visual C++中开发的 DLL。
     
     
     
    ------------------------------------------------------------------------------------------------------------------------------------------
     
     

    当使用了长字符串类型的参数、变量时要引用ShareMem。
    Delphi中的string类型很强大,我们知道普通的字符串长度最大为256个字符,但Delphi中string类型在默认情况下长度可以达到2G。这时,如果您坚持要使用string类型的参数、变量甚至是记录信息时,就要引用ShareMem单元,而且必须是第一个引用的。
    即在uses语句后是第一个引用的单元。
    如下例:
    uses
    ShareMem,
    SysUtils,
    Classes;
    还有一点,在您的工程文件(*.dpr)中而不是单元文件(*.pas)中也要做同样的工作,这一点Delphi自带的帮助文件没有说清楚,造成了很多误会。不这样做的话,您很有可能付出死机的代价。
    避免使用string类型的方法是将string类型的参数、变量等声明为Pchar或ShortString(如:s:string[10])类型。同样的问题会出现在当您使用了动态数组时,解决的方法同上所述。

    动态/静态调用DLL的两种方法的优缺点:

    静态方法实现简单,易于掌握并且一般来说稍微快一点,也更加安全可靠一些;
    但是静态方法不能灵活地在运行时装卸所需的DLL,而是在主程序开始运行时就装载指定的DLL直到程序结束时才释放该DLL,另外只有基于编译器和链接器的系统(如Delphi)才可以使用该方法。

    动态方法较好地解决了静态方法中存在的不足,可以方便地访问DLL中的函数和过程,甚至一些老版本DLL中新添加的函数或过程;
    动态方法难以完全掌握,使用时因为不同的函数或过程要定义很多很复杂的类型和调用方法。
    对于初学者,笔者建议您使用静态方法,待熟练后再使用动态调用方法。


    DLL编写技巧:


    1 、为了保证DLL的正确性,可先编写成普通的应用程序的一部分,调试无误后再从主程序中分离出来,编译成DLL。

    2 、为了保证DLL的通用性,应该在自己编写的DLL中杜绝出现可视化控件的名称,如:Edit1.Text中的Edit1名称;或者自定义非Windows定义的类型,如某种记录。

    3 、为便于调试,每个函数和过程应该尽可能短小精悍,并配合具体详细的注释。

    4 、应多利用try-finally来处理可能出现的错误和异常,注意这时要引用SysUtils单元。

    5 、尽可能少引用单元以减小DLL的大小,特别是不要引用可视化单元,如Dialogs单元。例如一般情况下,我们可以不引用Classes单元,这样可使编译后的DLL减小大约16Kb。

    delphi下DLL的调试方法:


    我们知道DLL在编写时是不能运行和单步调试的。
    有一个办法可以,那就是在Run|parameters菜单中设置一个宿主程序。
    在Local页的Host Application栏中添上宿主程序的名字就可进行单步调试、断点观察和运行了。

    添加DLL的版本信息:


    版本信息对于DLL是很重要的;如果包含了版本信息,DLL的大小会增加2Kb。

    增加这么一点空间是值得的。很不幸我们如果直接使用Project|options菜单中Version选项是不行的,这一点Delphi的帮助文件中没有提到,

    经笔者研究发现,只要加一行代码就可以了。
    如下例:
    library Delphi;

    uses
    SysUtils,
    Classes;

    {$R *.RES}
    //注意,上面这行代码必须加在这个位置

    function TestDll(i:integer):integer;stdcall;
    begin
    Result:=i;
    end;

    exports
    TestDll;

    begin
    end.



  • 相关阅读:
    org.apache.hadoop.security.AccessControlException: org.apache.hadoop.security.AccessControlException: Permission denied:
    linux iptables跟service 命令无效解决方法
    eclipse运行C++控制台不输出结果的解决办法
    C#操作mpp文件代码参考
    vs2010 开始执行(不调试) ctrl F5 出现任意键继续
    关于gcc、glibc和binutils模块之间的关系,以及在现有系统上如何升级的总结
    NUnit在Visual Studio 2010中的配置和使用
    【转】从CSDN的趣味题学C# 3.0
    gnome3程序图标下的文字如何改大
    使用autoconf、automake等来制作一个以源代码形式(.tar.gz)发布的软件、并可在执行configure时使用自定义参数
  • 原文地址:https://www.cnblogs.com/yzryc/p/6404151.html
Copyright © 2011-2022 走看看