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

來源:互聯網
上載者:User

前言

在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進行詳細的總結。希望對大家有一定的協助,最後,也希望大家提出你的想法和我分享。我堅信,交流是一種非常給力的學習方法。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.