国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++ COM編程之QueryInterface函數(二)

2020-05-23 14:21:01
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了C++ COM編程之QueryInterface函數(二),本文是第二篇,第一篇請參閱相關文檔,需要的朋友可以參考下
 
 

前言

COM編程——認識組件中也總結了,COM是一個說明如何建立可動態互變組件的規范,它提供了為保證能夠互操作,客戶和組件應遵循的一些標準。而在實現和使用QueryInterface時,就需要去遵守一些規則,只有遵守了這些規則,才能是一個正確的COM組件;只有了解了這些規則,才能會真正的了解COM開發。

QueryInterface的實現規則

實現QueryInterface需要遵從以下五條規則:

1.QueryInterface總是返回同一IUnknown指針

組件的實例只有一個IUnknown接口。因為當查詢組件實例的IUnknown接口時,不論通過哪個接口,所得到的均將是同一指針值。為確定兩個接口是否指向同一個組件,可以通過這兩個接口查詢IUnknown接口,然后將返回值進行比較。

這條規則是非常重要的,如果QueryInterface的實現不遵循這條規則的話,則將沒法決定兩個接口是否指向同一組件;

2.如果客戶曾經獲取過某個接口,那么它將總能獲得該接口

這條規則限定了對于一個組件實例,它的QueryInterface的不變性;你可以想象,如果組件實例的接口集不是固定的,客戶將無法通過編程的方法來決定一個組件到底具有一些什么樣的功能;客戶就會對你的COM組件失去耐心,你的COM組件都沒有人去使用了,這還有什么意義。

3.客戶可以再次獲取已經擁有的接口

如果客戶擁有一個IX接口,則可以通過它來再次查詢IX接口指針,并且一定可以成功的。通過自己查詢自己,聽起來多少有點奇怪,但是這是必須可以的。

4.客戶可以從任何接口返回到起始接口

如果客戶擁有一個IX接口指針,并成功地使用它來查詢了一個IY接口,那么它將可以使用這個IY接口來查詢一個IX接口,這條規則在實際的項目開發時很有用。

5.如果能夠從某接口獲取某特定接口,則從任意接口都將能獲取此接口

如果能夠從某個組件獲取某特定接口,那么客戶將可以通過此組件所支持的任意接口獲取此接口。例如:如果可以通過接口IX得到接口IY,通過IY可以得到IZ,那么通過IX也將可以得到IZ。這條規則使得QueryInterface是可用的。

綜上所有規則,其內在的重點在于不管組件實現了多少個接口,組件都只實現了一個QueryInterface,所以,在所有的接口的vtbl中,對應的QueryInterface都是組件實現的QueryInterface的地址,所有接口指針調用QueryInterface進行查詢時,都是調用的同一個QueryInterface,所以,這就滿足了上述的規則。大家在閱讀上面的這些規則時,難免會有些無所謂的感覺,覺得都是文字,很枯燥,我開始的時候也是這樣的;就是因為如此,在實際的開發中,吃過不少的苦頭,所以,今天又在這里把這些規則重新的整理一遍,希望大家不要在實際的項目中栽了跟頭再回來尋找原因,何不防范于未然呢?

添加新的接口

以前的博文也總結過了,COM中接口是不會發生變化的。當組件發布一個接口并被某個客戶使用之后,此接口將決不會發生任何變化,而將永遠保持不變。這里說的不變,具體是什么意思呢?由于每一個接口都有一個唯一對應的接口標識符IID。一般情況下,我們不會改變接口,而可以建立一個新接口并為之指定一個新的IID。當QueryInterface接收到對老的IID的查詢時,它將返回老的接口;而當它收到對新的IID的查詢時,它將返回新的接口。對于QueryInterface而言,一個IID就是一個接口。

所以同某個IID相應的接口將絕不會發生變化。新接口可以繼承老的接口,它也可以同老接口完全不同。由于老的接口仍然保持不變,已有客戶的運行將不會受到任何影響。而新客戶則可以自行決定是使用老接口還是新接口,因它可以自由決定到底是查詢哪個接口。

新接口命名

雖然每個人的命名規則,每個公司命名規則都是要求不同的,但是對于COM接口的命名大體上都是一致的,例如:原來的接口名為IX,則新的接口名為IX2,而不是IXEx之類的。我經歷了這么多的項目,寫過、也調用過很多的COM組件,基本都是遵循的這個規則,即在老名稱的后面加上一個數字。

總結

這篇文章總結的是理論,讓那些不喜歡理論的人會有點失望。但是,道理就是那樣的,沒有理論作為基礎的實踐,都是亂搞。做什么事情,都要有一定的理論基礎,所以,我通過了兩篇博文,對QueryInterface進行詳細的總結。希望對大家有一定的幫助,最后,也希望大家提出你的想法和我分享。我堅信,交流是一種非常給力的學習方法。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 正定县| 清丰县| 固阳县| 佛冈县| 合肥市| 晴隆县| 开江县| 大连市| 金秀| 闽侯县| 农安县| 二连浩特市| 津南区| 霍州市| 锦州市| 辽宁省| 承德市| 呼伦贝尔市| 浏阳市| 鹰潭市| 玛纳斯县| 贵定县| 龙游县| 临夏县| 海安县| 保靖县| 手游| 隆化县| 宜兰市| 额敏县| 忻州市| 佛学| 鹿泉市| 内江市| 巨野县| 惠水县| 社会| 吉林市| 福安市| 马鞍山市| 盐边县|