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.



  • 相关阅读:
    Populating Next Right Pointers in Each Node II
    Populating Next Right Pointers in Each Node
    Construct Binary Tree from Preorder and Inorder Traversal
    Construct Binary Tree from Inorder and Postorder Traversal
    Path Sum
    Symmetric Tree
    Solve Tree Problems Recursively
    632. Smallest Range(priority_queue)
    609. Find Duplicate File in System
    poj3159最短路spfa+邻接表
  • 原文地址:https://www.cnblogs.com/yzryc/p/6404151.html
Copyright © 2011-2022 走看看