1、COM對象的創(chuàng )建方法
客戶(hù)程序可以通過(guò)CoCreateInstance函數創(chuàng )建COM,在創(chuàng )建之前必須知道對象的一些基本情況,比如對象的CLSID或者對象的ProgID。
另一種對象創(chuàng )建方法是通過(guò)名字對象(moniker)創(chuàng )建,就是利用對象命名和綁定技術(shù)(即名字技術(shù))。
2、名字技術(shù)的地位
名字技術(shù)算不上COM的基本核心,但也是COM體系結構中重要的組成部分,它為客戶(hù)程序和組件程序提供了另一條更為靈活的聯(lián)系紐帶。OLE的成功使名字技術(shù)得到了廣泛的應用,而且在OLE和COM的不斷發(fā)展過(guò)程中,名字技術(shù)發(fā)揮了其強大的擴展特性,異步名字對象的實(shí)現使它超越了OLE的應用范圍,能更好地適用于網(wǎng)絡(luò )環(huán)境,特別是Internet網(wǎng)絡(luò ),體現了名字技術(shù)強大的生命力。
名字技術(shù)允許客戶(hù)程序通過(guò)符號化的方式訪(fǎng)問(wèn)組件對象,而不必通過(guò)CLSID和類(lèi)廠(chǎng)訪(fǎng)問(wèn)COM對象。名字技術(shù)不僅為COM對象提供了符號化的表達方式,而且它充分體現了面向對象軟件體系的一些重要概念,甚至可以把它當作軟件體系結構的一項技術(shù)來(lái)學(xué)習。
3、COM名字技術(shù)包括兩方面內容:命名技術(shù)和綁定過(guò)程
4、名字對象
名字技術(shù)的核心是名字對象,COM使用術(shù)語(yǔ)”moniker”來(lái)表示名字對象,它本身也是一個(gè)COM對象。名字對象為組件對象提供了符號化的表示方法,同時(shí)它也對組件對象進(jìn)行了全面的封裝,客戶(hù)程序只需創(chuàng )建相應的名字對象,然后利用名字對象的綁定功能得到組件對象。名字對象能夠自動(dòng)使組件對象從被動(dòng)狀態(tài)進(jìn)入運行狀態(tài),所以名字對象也稱(chēng)為永久智能名字(persistent intelligent names)。
名字對象封裝了組件對象的所有狀態(tài)處理過(guò)程,因此客戶(hù)程序可以按照統一的方法處理名字對象,即使要引用新的組件對象,客戶(hù)代碼也不必作任何改動(dòng)。
5、文件名與名字對象
文件名字對象(file moniker)是一種基本的名字對象,文件名也通過(guò)符號化的字符串名指向實(shí)際的文件。文件名代表了一個(gè)磁盤(pán)文件,文件名本身不是一個(gè)對象,它只代表了文件對象的路徑,因此,文件名不具有智能特性。
COM對象的永久狀態(tài)可以是整個(gè)文件,也可以是文件的一部分。
雖然名字對象扮演了與文件名相同的角色,但名字對象的功能要強大得多。首先,它所表達的對象范圍廣闊得多,除了一般的文件對象,它也可以表達文件中的部分內容,其次,名字對象具有智能特性,即它可以使被動(dòng)態(tài)的對象自動(dòng)進(jìn)入運行態(tài),名字對象找到與永久狀態(tài)聯(lián)系的運行代碼,并啟動(dòng)這些代碼,利用對象的初始化功能使對象進(jìn)入運行狀態(tài),這個(gè)過(guò)程就是名字對象的綁定操作。
6、名字對象的綁定過(guò)程
名字對象實(shí)現了標準的COM接口IMoniker,客戶(hù)程序通過(guò)IMoniker接口獲得組件對象。
客戶(hù)程序通過(guò)名字對象訪(fǎng)問(wèn)組件對象可以分成兩步:第一,獲得名字對象;第二,執行名字對象的綁定操作(使用IMoniker接口的函數BindToObject),綁定過(guò)程的結果就是組件對象的接口指針。
客戶(hù)程序獲得名字對象的途徑有兩條:第一,調用COM API函數,如MkParseDisplayName和CreateFileMoniker;第二,其他對象的接口成員函數傳遞過(guò)來(lái),或者通過(guò)其他的數據傳輸機制得到,比如通過(guò)剪貼板或拖-放操作等。
7、IMoniker
?。?) 名字管理函數:IsEqual、Hash、IsRunning、GetTimeOfLastChange。
?。?) 綁定函數:BindToObject、BindToStorage。
?。?) 復合名字對象管理函數:Reduce、ComposeWith、Enum、Inverse、CommonPrefixWith、RelativePathTo、IsSystemMoniker。
?。?) 名字解析函數:GetDisplayName、MkParseDisplayName。
8、復合名字對象
復合名字對象由一組其他的名字對象組成,也可以包括其他的復合名字對象,復合名字對象提供了一種創(chuàng )建任意復雜名字的機制。COM提供了一個(gè)標準的復合名字對象實(shí)現,稱(chēng)為“通用復合名字對象(generic composite moniker)”,并提供了標準API函數創(chuàng )建此類(lèi)名字對象:CreateGenericComposite。
IMoniker接口從IPersistStream派生而來(lái),所以名字對象也是一個(gè)永久對象,它可以有自己的永久狀態(tài)。復合名字對象的永久狀態(tài)是一個(gè)流,它順序保存了每個(gè)組成名字對象的永久狀態(tài)。
通用復合名字對象按統一的方式處理它的各個(gè)成員名字對象,無(wú)論是綁定過(guò)程還是其他一些操作,如名字解析、名字簡(jiǎn)化等?! ?/p>
COM使用運行對象表(ROT,running object table)表管理當前系統中正在運行的、已經(jīng)被注冊的名字對象,客戶(hù)程序可調用COM API函數GetRunningObjectTable得到ROT表的IRunningObjectTable接口指針。
IMoniker接口的大多數成員函數以及其他一些API函數都包含一個(gè)被稱(chēng)為綁定環(huán)境的對象,在這些函數中,以IBindCtx接口指針的形式出現。綁定環(huán)境對象主要用于名字對象的整個(gè)綁定過(guò)程,所以它包含了綁定過(guò)程所需要的一些信息。由于綁定環(huán)境對象是COM實(shí)現的系統對象,所以COM提供了一個(gè)API函數創(chuàng )建它:CreateBindCtx。綁定過(guò)程比較耗
聯(lián)系客服