zoukankan      html  css  js  c++  java
  • Delphi之DLL知识学习2---静态链接和动态链接

    静态连接

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

      程序运行时,函数和过程随程序一起调入内存,它们的位置与程序的位置是相关的。当主程序需要调用程序或过程时,流程将跳转到函数或过程所在的位置,执行完函数或过程的代码,将返回主程序调用位置。而函数和过程的相对位置,在链接时就已经确定了

      以上是对Delphi 编译器进行静态链接这一复杂过程的简单描述。

      注意:Delphi实现一个智能链接器,可以自动地把项目中没有引入的函数、过程和有类型的常量去掉,那么,最后的可执行文件就不会有冗余的代码

    动态链接

      结合:http://www.cnblogs.com/xumenger/p/4372289.html

      假设有两个应用程序,都要调用一个单元的同一个函数,当然,这两个应用程序都要在其 uses 子句中包含该单元。如果这两个程序要同时运行,那么内存中就存在两份该函数,如果还有第三个这样的应用程序,内存中就会有第三份该函数的实例,这样,就会三次占据内存。这个小例子就表明了动态链接的优越性之一。函数通过动态链接,被放到一个DLL中。那么如果一个应用程序把该函数调入内存,其他应用程序就可以通过映射DLL的映像到自己的进程内存空间来共享代码。理论上讲,最终结果是内存中只存在该DLL的一份实例

      对于动态链接,在程序运行时,通过引入一个外部函数(该函数包含在DLL中)而将该函数链接到可执行文件中。其中的引用可以在应用程序中声明,但是通常情况下是放在一个专门的引入(import)单元中,在这个单元中可以声明引入的函数、过程以及DLL所需的多种类型的定义

      例如,假设有一个交MaxLid.dll的动态链接库,其中包含一个函数

    function Max(i1, i2: Integer): Integer;
    

      这个函数返回两个整数中较大的一个数,一个典型的引入单元如下:

    unit MaxInt;
    interface
        function Max(i1, i2: Integer): Integer;
    
    implementation
        function Max; external 'MAXLIB';
    end;
    

      你也许注意到了,这看上去类似于一般的单元,但是这个单元没有定义Max()函数。关键字 external后面的字符串就是该 DLL的名称。要使用这个单元,应用只需要把MaxUnit加到它的 uses子句中即可。当这个程序运行时,该DLL就会自动地被调入内存,并且任何需要调用Max() 的程序都被链接到这个DLL中的 Max() 函数

      调用DLL有两种方式,这是其中一种,叫做隐式调用,就是让Windows 在应用程序调入时自动地调入所要调用的 DLL

      另一种是显式调用

  • 相关阅读:
    500 cannot be cast to javax.xml.registry.infomodel
    mybatis
    [Nest] 02.nest之控制器
    [React] react-interview-01
    [JavaScript] es6规则总结
    [JavaScript] Date对象
    [Vue] vuex-interview
    [Vue] vue-router-interview
    [Vue] vue的一些面试题4
    [Vue] vue的一些面试题3
  • 原文地址:https://www.cnblogs.com/xumenger/p/4452595.html
Copyright © 2011-2022 走看看