C++ COM編程之QueryInterface函數(shù)(二)
前言
在COM編程——認(rèn)識(shí)組件中也總結(jié)了,COM是一個(gè)說(shuō)明如何建立可動(dòng)態(tài)互變組件的規(guī)范,它提供了為保證能夠互操作,客戶和組件應(yīng)遵循的一些標(biāo)準(zhǔn)。而在實(shí)現(xiàn)和使用QueryInterface時(shí),就需要去遵守一些規(guī)則,只有遵守了這些規(guī)則,才能是一個(gè)正確的COM組件;只有了解了這些規(guī)則,才能會(huì)真正的了解COM開發(fā)。
QueryInterface的實(shí)現(xiàn)規(guī)則
實(shí)現(xiàn)QueryInterface需要遵從以下五條規(guī)則:
1.QueryInterface總是返回同一IUnknown指針
組件的實(shí)例只有一個(gè)IUnknown接口。因?yàn)楫?dāng)查詢組件實(shí)例的IUnknown接口時(shí),不論通過(guò)哪個(gè)接口,所得到的均將是同一指針值。為確定兩個(gè)接口是否指向同一個(gè)組件,可以通過(guò)這兩個(gè)接口查詢IUnknown接口,然后將返回值進(jìn)行比較。
這條規(guī)則是非常重要的,如果QueryInterface的實(shí)現(xiàn)不遵循這條規(guī)則的話,則將沒法決定兩個(gè)接口是否指向同一組件;
2.如果客戶曾經(jīng)獲取過(guò)某個(gè)接口,那么它將總能獲得該接口
這條規(guī)則限定了對(duì)于一個(gè)組件實(shí)例,它的QueryInterface的不變性;你可以想象,如果組件實(shí)例的接口集不是固定的,客戶將無(wú)法通過(guò)編程的方法來(lái)決定一個(gè)組件到底具有一些什么樣的功能;客戶就會(huì)對(duì)你的COM組件失去耐心,你的COM組件都沒有人去使用了,這還有什么意義。
3.客戶可以再次獲取已經(jīng)擁有的接口
如果客戶擁有一個(gè)IX接口,則可以通過(guò)它來(lái)再次查詢IX接口指針,并且一定可以成功的。通過(guò)自己查詢自己,聽起來(lái)多少有點(diǎn)奇怪,但是這是必須可以的。
4.客戶可以從任何接口返回到起始接口
如果客戶擁有一個(gè)IX接口指針,并成功地使用它來(lái)查詢了一個(gè)IY接口,那么它將可以使用這個(gè)IY接口來(lái)查詢一個(gè)IX接口,這條規(guī)則在實(shí)際的項(xiàng)目開發(fā)時(shí)很有用。
5.如果能夠從某接口獲取某特定接口,則從任意接口都將能獲取此接口
如果能夠從某個(gè)組件獲取某特定接口,那么客戶將可以通過(guò)此組件所支持的任意接口獲取此接口。例如:如果可以通過(guò)接口IX得到接口IY,通過(guò)IY可以得到IZ,那么通過(guò)IX也將可以得到IZ。這條規(guī)則使得QueryInterface是可用的。
綜上所有規(guī)則,其內(nèi)在的重點(diǎn)在于不管組件實(shí)現(xiàn)了多少個(gè)接口,組件都只實(shí)現(xiàn)了一個(gè)QueryInterface,所以,在所有的接口的vtbl中,對(duì)應(yīng)的QueryInterface都是組件實(shí)現(xiàn)的QueryInterface的地址,所有接口指針調(diào)用QueryInterface進(jìn)行查詢時(shí),都是調(diào)用的同一個(gè)QueryInterface,所以,這就滿足了上述的規(guī)則。大家在閱讀上面的這些規(guī)則時(shí),難免會(huì)有些無(wú)所謂的感覺,覺得都是文字,很枯燥,我開始的時(shí)候也是這樣的;就是因?yàn)槿绱?,在?shí)際的開發(fā)中,吃過(guò)不少的苦頭,所以,今天又在這里把這些規(guī)則重新的整理一遍,希望大家不要在實(shí)際的項(xiàng)目中栽了跟頭再回來(lái)尋找原因,何不防范于未然呢?
添加新的接口
以前的博文也總結(jié)過(guò)了,COM中接口是不會(huì)發(fā)生變化的。當(dāng)組件發(fā)布一個(gè)接口并被某個(gè)客戶使用之后,此接口將決不會(huì)發(fā)生任何變化,而將永遠(yuǎn)保持不變。這里說(shuō)的不變,具體是什么意思呢?由于每一個(gè)接口都有一個(gè)唯一對(duì)應(yīng)的接口標(biāo)識(shí)符IID。一般情況下,我們不會(huì)改變接口,而可以建立一個(gè)新接口并為之指定一個(gè)新的IID。當(dāng)QueryInterface接收到對(duì)老的IID的查詢時(shí),它將返回老的接口;而當(dāng)它收到對(duì)新的IID的查詢時(shí),它將返回新的接口。對(duì)于QueryInterface而言,一個(gè)IID就是一個(gè)接口。
所以同某個(gè)IID相應(yīng)的接口將絕不會(huì)發(fā)生變化。新接口可以繼承老的接口,它也可以同老接口完全不同。由于老的接口仍然保持不變,已有客戶的運(yùn)行將不會(huì)受到任何影響。而新客戶則可以自行決定是使用老接口還是新接口,因它可以自由決定到底是查詢哪個(gè)接口。
新接口命名
雖然每個(gè)人的命名規(guī)則,每個(gè)公司命名規(guī)則都是要求不同的,但是對(duì)于COM接口的命名大體上都是一致的,例如:原來(lái)的接口名為IX,則新的接口名為IX2,而不是IXEx之類的。我經(jīng)歷了這么多的項(xiàng)目,寫過(guò)、也調(diào)用過(guò)很多的COM組件,基本都是遵循的這個(gè)規(guī)則,即在老名稱的后面加上一個(gè)數(shù)字。
總結(jié)
這篇文章總結(jié)的是理論,讓那些不喜歡理論的人會(huì)有點(diǎn)失望。但是,道理就是那樣的,沒有理論作為基礎(chǔ)的實(shí)踐,都是亂搞。做什么事情,都要有一定的理論基礎(chǔ),所以,我通過(guò)了兩篇博文,對(duì)QueryInterface進(jìn)行詳細(xì)的總結(jié)。希望對(duì)大家有一定的幫助,最后,也希望大家提出你的想法和我分享。我堅(jiān)信,交流是一種非常給力的學(xué)習(xí)方法。
上一篇:C++交換指針實(shí)例
欄 目:C語(yǔ)言
本文標(biāo)題:C++ COM編程之QueryInterface函數(shù)(二)
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/3311.html
您可能感興趣的文章
- 04-02c語(yǔ)言沒有round函數(shù) round c語(yǔ)言
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10c++中inline的用法分析
- 01-10用C++實(shí)現(xiàn)DBSCAN聚類算法
- 01-10全排列算法的非遞歸實(shí)現(xiàn)與遞歸實(shí)現(xiàn)的方法(C++)
- 01-10C++大數(shù)模板(推薦)
- 01-10淺談C/C++中的static與extern關(guān)鍵字的使用詳解
- 01-10深入C/C++浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)方式詳解
- 01-10深入理解C/C++混合編程


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 04-02jquery與jsp,用jquery
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10delphi制作wav文件的方法