一. 链接库概述

来源:互联网 发布:微信网络诈骗怎么报案 编辑:程序博客网 时间:2024/06/04 20:06

  先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量、函数或类。在仓库的发展史上经历了“无库-静态链接库-动态链接库”的时代。

   静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。但是若使 用DLL,该DLL不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。静态链接库和动态链接库的另 外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。如属性配置中<MFC 的使用>设成<在静态库中使用 MFC>则打包时不用打进一些MFC的DLL文件。

  对动态链接库,我们还需建立如下概念:

  (1)DLL 的编制与具体的编程语言及编译器无关
  只要遵循约定的DLL接口规范和调用方式,用各种语言编写的DLL都可以相互调用。譬如Windows提供的系统DLL(其中包括了Windows的API),在任何开发环境中都能被调用,不在乎其是Visual Basic、Visual C++还是Delphi。

  (2)动态链接库随处可见
   我们在Windows目录下的system32文件夹中会看到kernel32.dll、user32.dll和gdi32.dll,windows的 大多数API都包含在这些DLL中。kernel32.dll中的函数主要处理内存管理和进程调度;user32.dll中的函数主要控制用户界面; gdi32.dll中的函数则负责图形方面的操作。

  一般的程序员都用过类似MessageBox的函数,其实它就包含在user32.dll这个动态链接库中。由此可见DLL对我们来说其实并不陌生。

  (3)VC动态链接库的分类
  Visual C++支持三种DLL,它们分别是Non-MFC DLL(非MFC动态库)、MFC Regular DLL(MFC规则DLL)、MFC Extension DLL(MFC扩展DLL)。

   非MFC动态库不采用MFC类库结构,其导出函数为标准的C接口,能被非MFC或MFC编写的应用程序所调用;MFC规则DLL 包含一个继承自CWinApp的类,但其无消息循环。导出接口不能用MFC类库,但内部实现可用MFC类库,初始时预处理器定义中没有_AFXEXT所以不能用VC默认宏定义作导出前缀;MFC扩展DLL采用MFC的动态链接版本创建,它只能被用MFC类库所编写的应用程序所调用。能在导出接口中用MFC类库,生成时有_AFXEXT定义。

      静态链接库导出函数前不用加Export等导出标志。

      库的调用方式:

      1.包含相应头文件,再用#pragma comment(lib, "..//debug//StaticLib.lib" ) //指定本文件生成的.obj与静态库一起连接。便可使用,最好使用相对路径。

      2.在工具-选项中指定目录,再在项目属性中指定附加包含目录.h和附加依赖项.lib。

      3.对于动态链接库dll,可以在程序中“动态”地引用和卸载这个DLL文件。

 

 

COM和DLL的一些区别

com英文为Component Object Model(组件对象模型),是微软生产软件组件的标准。

它是构造二进制兼容软件组件的规范,不管组件应用何种语言编写只要遵循com规范就可以

相互直接通信。提出com规范主要是为了满足:

1.程序的快速开发,可以将一个大型的工程分成若干个com组件同时开发。

2.可以动态的插入或卸载com组件。

3.可以隐藏或封装com组件内部的实现细节。

com组件可以由不同的语言进行编写,但com组件之间的通信是通过组件的接口来实现的,

com组件接口的实现是统一的,它采用的是虚拟函数表(VTBL)形式。虚拟函数表中包含了

组件函数的一组指针,我们可以通过这组指针来获取我们想要通信的组件函数的内存地址。

dll(动态链接库)是包含函数和数据的模块的集合。它可以导出数据也可以导出函数以供

其它的dll调用。dll的加载可以通过静态链接和动态链接两种方式。 

 

1.静态链接时将所要链接的dll模块以二进制的形式编译进其他模块。 

2.动态链接指调用模块在运行时加载DLL,使用LoadLibrary函数或LoadLibraryEx

函数将dll 加载到进程的地址空间,并调用GetProcAddress函数以获取导出的 DLL

函数的地址。 

动态加载dll的优点: 

1.DLL可节省内存并减少交换。通过在内存中共享 DLL 的单个副本,多个进程可以同时

使用一个DLL。相比之下,对于使用静态链接库构建的每一个应用程序,Windows 都要

在内存中为其加载库代码的一个副本。 

2.DLL 可节省磁盘空间。 多个应用程序可以共享磁盘上的一个 DLL 副本。相比之下,

使用静态 链接库构建的每一个应用程序都需要让链接到程序文件映像的库代码作为一个

单独的专用副本。 

dll与com的关系:com是一种规范,按照是com规范实现的dll可以被视为com组件,

例如我们用mfc建立的Active X控件工程其中的接口封装是靠idl描述的所以可以视为

com组件。而且从上面关于com和dll的说明可以看出com组件的接口是一组具有特定规范的

函数,所以com组件可以别视为dll但dll不一定是com组件。

com和DLL最大的区别就是: dll是以函数集合的方式来调用的是编程语言相关的象VC必须

加上extern "C"...而COM是以interface的方式提供给用户使用的是一种二进制的调用

规范,是与编程语言无关的,它使用idl接口定义语言来描述自己使用类继承来实现自己的功能

和方法.DLL只有DLL一种形势,里面可任意定义函数无限制,只能运行在本机上 而COM

有DLL和EXE两种存在形势: COM所在的DLL中必须导出四个函数:

dllgetobjectclass, dllregisterserver, dllunregisterserver,

dllunloadnow

这四个函数各有作用,有些是提供给COM管理器用的,通过CLSID和IID来使用,有些是提供

给注册机用的.

COM结合MTS,就是COM+, 是DCOM的高级版本,提供了更为强大和安全的分布式COM服务,

DCOM运行在不同的机器上 用proxy和stub来实现远程接口的本地映射 二者从执行速度来

说 二者相差无几 但是启动速度DLL要比COM快!


  本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/goldenocean/archive/2008/01/10/2033841.aspx

原创粉丝点击