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