com英文為Component Object Model(組件對(duì)象模型),是微軟生產(chǎn)軟件組件的標(biāo)準(zhǔn)。
它是構(gòu)造二進(jìn)制兼容軟件組件的規(guī)范,不管組件應(yīng)用何種語(yǔ)言編寫(xiě)只要遵循com規(guī)范就可以
相互直接通信。提出com規(guī)范主要是為了滿足:
1.程序的快速開(kāi)發(fā),可以將一個(gè)大型的工程分成若干個(gè)com組件同時(shí)開(kāi)發(fā)。
2.可以動(dòng)態(tài)的插入或卸載com組件。
3.可以隱藏或封裝com組件內(nèi)部的實(shí)現(xiàn)細(xì)節(jié)。
com組件可以由不同的語(yǔ)言進(jìn)行編寫(xiě),但com組件之間的通信是通過(guò)組件的接口來(lái)實(shí)現(xiàn)的,
com組件接口的實(shí)現(xiàn)是統(tǒng)一的,它采用的是虛擬函數(shù)表(VTBL)形式。虛擬函數(shù)表中包含了
組件函數(shù)的一組指針,我們可以通過(guò)這組指針來(lái)獲取我們想要通信的組件函數(shù)的內(nèi)存地址。
dll(動(dòng)態(tài)鏈接庫(kù))是包含函數(shù)和數(shù)據(jù)的模塊的集合。它可以導(dǎo)出數(shù)據(jù)也可以導(dǎo)出函數(shù)以供
其它的dll調(diào)用。dll的加載可以通過(guò)靜態(tài)鏈接和動(dòng)態(tài)鏈接兩種方式。
1.靜態(tài)鏈接時(shí)將所要鏈接的dll模塊以二進(jìn)制的形式編譯進(jìn)其他模塊。
2.動(dòng)態(tài)鏈接指調(diào)用模塊在運(yùn)行時(shí)加載DLL,使用LoadLibrary函數(shù)或LoadLibraryEx
函數(shù)將dll 加載到進(jìn)程的地址空間,并調(diào)用GetProcAddress函數(shù)以獲取導(dǎo)出的 DLL
函數(shù)的地址。
動(dòng)態(tài)加載dll的優(yōu)點(diǎn):
1.DLL可節(jié)省內(nèi)存并減少交換。通過(guò)在內(nèi)存中共享 DLL 的單個(gè)副本,多個(gè)進(jìn)程可以同時(shí)
使用一個(gè)DLL。相比之下,對(duì)于使用靜態(tài)鏈接庫(kù)構(gòu)建的每一個(gè)應(yīng)用程序,Windows 都要
在內(nèi)存中為其加載庫(kù)代碼的一個(gè)副本。
2.DLL 可節(jié)省磁盤(pán)空間。 多個(gè)應(yīng)用程序可以共享磁盤(pán)上的一個(gè) DLL 副本。相比之下,
使用靜態(tài) 鏈接庫(kù)構(gòu)建的每一個(gè)應(yīng)用程序都需要讓鏈接到程序文件映像的庫(kù)代碼作為一個(gè)
單獨(dú)的專用副本。
dll與com的關(guān)系:com是一種規(guī)范,按照是com規(guī)范實(shí)現(xiàn)的dll可以被視為com組件,
例如我們用mfc建立的Active X控件工程其中的接口封裝是靠idl描述的所以可以視為
com組件。而且從上面關(guān)于com和dll的說(shuō)明可以看出com組件的接口是一組具有特定規(guī)范的
函數(shù),所以com組件可以別視為dll但dll不一定是com組件。
com和DLL最大的區(qū)別就是: dll是以函數(shù)集合的方式來(lái)調(diào)用的是編程語(yǔ)言相關(guān)的象VC必須
加上extern "C"...而COM是以interface的方式提供給用戶使用的是一種二進(jìn)制的調(diào)用
規(guī)范,是與編程語(yǔ)言無(wú)關(guān)的,它使用idl接口定義語(yǔ)言來(lái)描述自己使用類繼承來(lái)實(shí)現(xiàn)自己的功能
和方法.DLL只有DLL一種形勢(shì),里面可任意定義函數(shù)無(wú)限制,只能運(yùn)行在本機(jī)上 而COM
有DLL和EXE兩種存在形勢(shì): COM所在的DLL中必須導(dǎo)出四個(gè)函數(shù):
dllgetobjectclass, dllregisterserver, dllunregisterserver,
dllunloadnow
這四個(gè)函數(shù)各有作用,有些是提供給COM管理器用的,通過(guò)CLSID和IID來(lái)使用,有些是提供
給注冊(cè)機(jī)用的.
COM結(jié)合MTS,就是COM+, 是DCOM的高級(jí)版本,提供了更為強(qiáng)大和安全的分布式COM服務(wù),
DCOM運(yùn)行在不同的機(jī)器上 用proxy和stub來(lái)實(shí)現(xiàn)遠(yuǎn)程接口的本地映射 二者從執(zhí)行速度來(lái)
說(shuō) 二者相差無(wú)幾 但是啟動(dòng)速度DLL要比COM快!