組件對(duì)象模型_第1頁(yè)
組件對(duì)象模型_第2頁(yè)
組件對(duì)象模型_第3頁(yè)
組件對(duì)象模型_第4頁(yè)
組件對(duì)象模型_第5頁(yè)
已閱讀5頁(yè),還剩2頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

組件對(duì)象模型控件和組件是什么一樣把Control翻譯成控件,把Component翻譯成組件??丶_實(shí)是具有效戶界面的組件。要說(shuō)的具體一點(diǎn),就得回憶初期Windows的歷史本源,那時(shí)控件指任何子窗口——按鈕、列表框、編輯框或某個(gè)對(duì)話框中的靜態(tài)文本。從概念上講,這些窗口——控件——類似用來(lái)操作收音機(jī)或小電器的旋鈕和按鈕。隨著控件數(shù)量的增加(組合框、日期時(shí)刻控件等等),控件慢慢成為子窗口的代名詞,不管是用在對(duì)話框中仍是用在其它種類的主窗口中。沒(méi)過(guò)量久BASIC程序員開始編寫他們自己專用的控件,自但是然地人們便想到共享這些控件。共享代碼的方式之一是通過(guò)磁盤拷貝,但那樣顯然效率低下。必需要有一種機(jī)制使開發(fā)者成立的控件能夠在其它程序員的應(yīng)用中輕而易舉地插入,這即是VBA控件,OLE控件,OCX和最后ActiveX控件的動(dòng)機(jī)。這確實(shí)是控件和組件之間產(chǎn)生混淆之所在。因?yàn)闉榱私鉀Q控件的可復(fù)用問(wèn)題,所有這些技術(shù)必需第一解決更為一樣的組件重用問(wèn)題。(COM,若是你還記得它的話,意思是組件對(duì)象模型)。在軟件行話中,組件那個(gè)術(shù)語(yǔ)指任何可復(fù)用的對(duì)象或任何可與其它對(duì)象交互的代碼體。子程序的發(fā)明,曾經(jīng)一度成為程序員趨之假設(shè)鶩的軟件工程圣杯:一種統(tǒng)一的編程理論,它使程序員從大體構(gòu)建塊——也確實(shí)是用所選語(yǔ)言編寫的各類組件成立大型系統(tǒng)。從子程序演變到OOP,到DLLs,再到COM,再到.NET框架的每一種新的編程范例都代表了一種不同的提供可重用性的方案。VBX利用DLLs的固化名稱。COM利用接口和IUnknown。.NET框架利用微軟的中間語(yǔ)言(MSIL)層和公共語(yǔ)言運(yùn)行時(shí)(CLR)來(lái)提供統(tǒng)一的粘合。因此,控件是組件的一個(gè)要緊樣本(而且歷史上曾驅(qū)動(dòng)著組件的開發(fā)),控件又不單單是唯一的一種組件。組件不需要顯示任何信息或用戶界面。組件可能實(shí)現(xiàn)科學(xué)計(jì)算,搜集性能數(shù)據(jù)。規(guī)那么1:必需實(shí)現(xiàn)IunknownIUnKnown接口的概念:IUnKnown是一個(gè)接口。所有COM接口都繼承IUnKnown。IUnKnown的概念在WIN32SDK中的UNKNWN頭文件中。深切:COM組件實(shí)際上是一種特殊的類,遵循一個(gè)統(tǒng)一的標(biāo)準(zhǔn),使到各個(gè)軟件都能夠通過(guò)某種方式訪問(wèn)那個(gè)類的函數(shù)和方式,也就能夠夠做到組件通用.com確實(shí)是統(tǒng)一的標(biāo)準(zhǔn)--通過(guò)接口來(lái)挪用com組件.接口是你的com組件能被外界所感知的部份,實(shí)際確實(shí)是一組方式(虛函數(shù)).

IUnknown是所有接口的基礎(chǔ),他負(fù)責(zé)兩項(xiàng)工作:

IUnknown::QueryInterface負(fù)責(zé)取得該組件的其他接口的指針

IUnknown::AddRef/Release負(fù)責(zé)治理該組件的生存期,但有人利用該組件時(shí),保證該組件可不能被意外刪除;再?zèng)]人利用該組件時(shí),保證該組件被自動(dòng)刪除

COM是組件對(duì)象模型,她是繼面象對(duì)向以后的一種思想,而不是一種簡(jiǎn)單的實(shí)現(xiàn)。

通過(guò)IDL,很多具體的工作都能夠?qū)崿F(xiàn)她,如VC、VB等。

一句話:COM是接口(組件)的集合,接口是方式和屬性的集合。

要了解COM,就得先了解IUnknown接口,IUnknown接口的C++形式的概念如下:

interface

IUnknown

{

virtual

HRESULT

_stdcall

QueryInterface([in]REFIID

iid,[out]void

*

*

ppv)=0;

virtual

ULONG

_stdcall

AddRef(void)=0;

virtual

ULONG

_stdcall

Release(void)=0;

}

她實(shí)現(xiàn)了“接口查詢”和“引用計(jì)數(shù)”,她是一個(gè)純抽象基類。

所有COM

概念的接口都必需從她繼承。實(shí)現(xiàn)的COM接口都應(yīng)該遵守必然的原那么:

1。查詢IUnknown接口取得的必需一樣。

2。接口對(duì)稱性。

3。接口彼此性。

4。接口傳遞性。

5。時(shí)刻無(wú)關(guān)性。

要學(xué)好COM,必然得弄清楚COM的原理。

若是你學(xué)過(guò)C++或類似語(yǔ)言的話,這就比較好明白得了。在C++里,一個(gè)子類能夠從父類繼承,如此子類能夠復(fù)用父類的函數(shù)和成員。在COM里,一個(gè)接口和一個(gè)類很相似,一個(gè)接口能夠從另一個(gè)接口繼承,可是與C++的區(qū)別是,接口的繼承只是繼承說(shuō)明,不繼承實(shí)現(xiàn)。微軟規(guī)定了所有的標(biāo)準(zhǔn)接口必需從IUnknown接口“繼承”,以取得組件的兩個(gè)大體能力:引用計(jì)數(shù)和查詢接口。

一個(gè)Free的域名:,此刻放了一名老外寫的學(xué)習(xí)心得。IUnknown接口是一個(gè)很一般的類或結(jié)構(gòu),你乃至能夠自己寫他,只是他有特殊的規(guī)定,必需有QueryInterface,AddRef,Relaese方式。能夠說(shuō)他是所有COM類的基類。原始的IUnknown類是一個(gè)純虛類,什么也不能干,用戶必需重載并實(shí)現(xiàn)他的所有方式,之因此要用IUnknown虛擬類,只是為了接口統(tǒng)一。也確實(shí)是說(shuō)所有COM類這三個(gè)方式的地址在函數(shù)虛擬表中是完全一樣的。COM中的接口和C++中的類有些是相同的,可是也有一些區(qū)別,在COM中有一些接口他里面有些函數(shù)是微軟在出廠時(shí)就已經(jīng)編寫好了的,可是,他也提供了一些多余的接口,他只做了概念,可是沒(méi)有實(shí)例化,你能夠利用VC編寫程序了將他實(shí)例化,就能夠夠?qū)崿F(xiàn)自己要求的功能了,可是你也要編寫一個(gè)注冊(cè)程序,至于如何編寫要看你利用的接口而定了。有一套教程,超級(jí)好,有生動(dòng)的例子和循序漸進(jìn)的說(shuō)明。最終的結(jié)論是,要在Windows平臺(tái)上實(shí)現(xiàn)組件(可獨(dú)立發(fā)布的程序單元)應(yīng)該是COM此刻這種形式。URL為:

比較適合于初學(xué)者,只需C++的基礎(chǔ),學(xué)起來(lái)也比較輕松。學(xué)完以后,比看任何一本關(guān)于COM的書都要明白得得好。若是一個(gè)對(duì)象沒(méi)有至少實(shí)現(xiàn)一個(gè)最小程度為IUnknown的接口,那它就不是Microsoft的組件對(duì)象模型(COM)。接口設(shè)計(jì)規(guī)那么接口必需直接或間接地從IUnknown繼承。接口必需有唯一的識(shí)別(IID)。接口是不變的。一旦分派和發(fā)布了IID,接口概念的任何因素都不能被改變。接口的成員函數(shù)應(yīng)該有HRESULT類型的返回值,使遠(yuǎn)端結(jié)構(gòu)可報(bào)告遠(yuǎn)程進(jìn)程挪用(RPC)錯(cuò)誤的情形。接口成員函數(shù)的字符串參數(shù)應(yīng)該是Unicode。實(shí)現(xiàn)IUnknown對(duì)象的同一性。這要求對(duì)任何特定IUnknown接口的給定對(duì)象實(shí)例的QueryInterface挪用返回相同的物理指針變量。這致使了所謂的兩個(gè)接口的QueryInterface(IID_IUnknown,...)和結(jié)果的比較,以確信它們是不是為同一對(duì)象(COM對(duì)象同一性)。靜態(tài)接口的設(shè)置。任何經(jīng)由QueryInterface來(lái)訪問(wèn)對(duì)象的接口的設(shè)置,必需是靜態(tài)而不是動(dòng)態(tài)的。也確實(shí)是說(shuō),假設(shè)一旦QueryInterface取得了一個(gè)給定的IID,那么它老是對(duì)相同的對(duì)象(除非成心想不到情形)挪用,假設(shè)QueryInterface不能取得一個(gè)給定的IID,那么隨后對(duì)相同IID的對(duì)象挪用必然會(huì)失敗。對(duì)象完整性。關(guān)于可處置的接口設(shè)置,必需有反身性,對(duì)稱性和過(guò)渡性。即給定代碼如下:IA*pA=(somefunctionreturninganIA*);IB*pB=NULL;HRESULThr;hr=pA->QueryInterface(IID_IB,&pB);.)mustsucceed(a>>a)Reflexive:If,inline4,pBwassuccessfullyobtained,thenpB->QueryInterface(IID_IA,...)mustsucceed(a>>b,thenb>>a);Transitive:If,inline4,pBwassuccessfullyobtained,andwedoIC*pC=NULL;hr=pB->QueryInterface(IID_IC,&pC);.)mustsucceed(a>>b,andb>>c,thena>>c).最小參考效勞大小。咱們需要實(shí)現(xiàn)AddRef來(lái)保護(hù)一個(gè)效勞臺(tái),它足夠大以便支持給定對(duì)象的所有接口的231–1有超卓的整體指示效勞。一個(gè)32-位的無(wú)符號(hào)整型數(shù)知足要求。Release并非意味著失敗。假設(shè)客戶想明白關(guān)于資源已被釋放等情形,就必需在挪用Release之前利用一些對(duì)象接口中的較高的語(yǔ)義。內(nèi)存治理規(guī)那么接口指針的生命期治理老是通過(guò)成立在每一個(gè)COM接口上的AddRef和Release方式來(lái)實(shí)現(xiàn)。(參見(jiàn)下面的“引用計(jì)數(shù)規(guī)那么”)下面的規(guī)那么適用于接口成員函數(shù)的參數(shù),包括不是“按值”傳遞的返回值。關(guān)于參數(shù)來(lái)講,挪用程序應(yīng)分派和釋放內(nèi)存。出口參數(shù)必需由被挪用程序分派,由挪用程序用標(biāo)準(zhǔn)的COM內(nèi)存分派程序來(lái)釋放。出入?yún)?shù)第一由挪用程序分派,必要時(shí)由被挪用程序釋放及重分派。至于出口參數(shù),挪用程序有責(zé)任釋放最終返回變量?,F(xiàn)在必需利用標(biāo)準(zhǔn)的COM內(nèi)存分派程序。假設(shè)函數(shù)返回挪用失敗的代碼,那么通常挪用者沒(méi)方法清除出口和入出口參數(shù)。這致使了一些附加規(guī)那么:錯(cuò)誤返回時(shí),出口參數(shù)必需靠得住地被設(shè)置成可清除變量,它不能對(duì)挪用程序有阻礙。另外,所有的出口指針參數(shù)(包括挪用分派,被挪用委任結(jié)構(gòu))必需被明顯地設(shè)為NULL。最直接的方式是在函數(shù)說(shuō)明項(xiàng)中設(shè)成NULL。返回錯(cuò)誤時(shí),所有的入出口參數(shù)必需為被挪用者所擱置(如此維持為挪用程序初始化的值;假設(shè)挪用程序沒(méi)有對(duì)它初始化,那么它是個(gè)出口參數(shù),不是入出口參數(shù)),或被明顯地設(shè)為出口錯(cuò)誤返回情形。參考計(jì)數(shù)規(guī)那么:規(guī)那么1:關(guān)于接口指針的每一個(gè)新的副本,AddRef必需被挪用;Release在接口指針的每一個(gè)破壞時(shí)挪用,除子規(guī)那么明顯許諾了其他情形。以下規(guī)那么對(duì)應(yīng)于規(guī)那么1的非例外情形。規(guī)那么1a:函數(shù)的入口出口參數(shù)。挪用程序必需AddRef實(shí)際參數(shù),因?yàn)楫?dāng)出口變量寄存在它之上時(shí),將由被調(diào)程序釋放。規(guī)那么1b:獲取全局變量。從全局變量的已存在的指針副本取得的接口指針的局部副本,必需被獨(dú)立地引用計(jì)數(shù)。因?yàn)榇嬖诰植扛北緯r(shí),被調(diào)函數(shù)會(huì)破壞全局副本。規(guī)那么1c:新指針合成所需資源不多。函數(shù)利用內(nèi)在知識(shí)合成接口指針,而不是從其他資源所得,現(xiàn)在必需對(duì)新指針做初始AddRef。如此的重要例子有事例生成法那么,Iunknown::QueryInterface的實(shí)現(xiàn),等等。規(guī)那么1d:內(nèi)部存儲(chǔ)指針副本的返回。指針?lè)祷匾院螅徽{(diào)程序不明白它的生命期和指針的內(nèi)部存儲(chǔ)副本如何聯(lián)系。因此,被調(diào)程序必需在返回前對(duì)指針副本挪用AddRef。規(guī)那么2:關(guān)于接口指針的兩個(gè)或更多的副本,它們的生命期的起始和終了的關(guān)系代碼的特定知識(shí),使AddRef/Release能夠被省略。從COM客戶的角度,引用計(jì)數(shù)是和接口對(duì)應(yīng)的概念??蛻舨辉撘詾閷?duì)象的所有接口有同一引用計(jì)數(shù)。不該依托于Addref&Release的返回值,而應(yīng)用于調(diào)試目的。指針?lè)€(wěn)固性;參見(jiàn)在"Reference-CountingRules"下的OLE幫忙文件中的子部份:"StabilizingthethisPointerandKeepingitValid"。COM申請(qǐng)責(zé)任:以客戶,效勞器,對(duì)象執(zhí)行者之一身份利用COM的每一進(jìn)程,要對(duì)三件事負(fù)責(zé):確信COM庫(kù)是同COM函數(shù)CoBuildVersion一致的版本。在利用其他函數(shù)之前通過(guò)挪用CoInitialize初始化COM庫(kù)。在不用CoUninitialize時(shí)取消COM庫(kù)的初始化。進(jìn)程內(nèi)效勞器能假定載入的進(jìn)程已執(zhí)行了這些步驟。效勞器規(guī)那么進(jìn)程內(nèi)效勞器必需輸出DllGetClassObjectandDllCanUnloadNow。進(jìn)程內(nèi)效勞器必需支持COM自注冊(cè)。進(jìn)程內(nèi)和局部效勞器應(yīng)該在它們的文件版本信息中提供OLESelfReg字符串。進(jìn)程內(nèi)效勞器必需輸出DllRegisterServerandDllUnRegisterServer。局部效勞器應(yīng)支持/RegServerand/UnRegServer命令行開關(guān)。生成集合對(duì)象生成可合計(jì)的對(duì)象是可選的,且操作簡(jiǎn)單,有諸多益處。以下規(guī)那么利用于創(chuàng)建可合計(jì)的對(duì)象(通常稱為內(nèi)部對(duì)象)。由QueryInterface,AddRef,和Release對(duì)IUnknown接口的內(nèi)部對(duì)象執(zhí)行單獨(dú)操縱內(nèi)部接口的引用計(jì)數(shù),且不能授權(quán)給外部未知指針。這種IUnknown執(zhí)行稱為隱式IUnknown。內(nèi)部對(duì)象執(zhí)行接口的QueryInterface,AddRef,和Release成員的實(shí)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論