先來闡述一下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