最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2014年10月01日 11:00:33   作者:果凍想  
這篇文章主要介紹了C++ COM編程之QueryInterface函數(shù)(二),本文是第二篇,第一篇請參閱相關(guān)文檔,需要的朋友可以參考下

前言

COM編程——認(rèn)識組件中也總結(jié)了,COM是一個(gè)說明如何建立可動態(tài)互變組件的規(guī)范,它提供了為保證能夠互操作,客戶和組件應(yīng)遵循的一些標(biāo)準(zhǔn)。而在實(shí)現(xiàn)和使用QueryInterface時(shí),就需要去遵守一些規(guī)則,只有遵守了這些規(guī)則,才能是一個(gè)正確的COM組件;只有了解了這些規(guī)則,才能會真正的了解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í),不論通過哪個(gè)接口,所得到的均將是同一指針值。為確定兩個(gè)接口是否指向同一個(gè)組件,可以通過這兩個(gè)接口查詢IUnknown接口,然后將返回值進(jìn)行比較。

這條規(guī)則是非常重要的,如果QueryInterface的實(shí)現(xiàn)不遵循這條規(guī)則的話,則將沒法決定兩個(gè)接口是否指向同一組件;

2.如果客戶曾經(jīng)獲取過某個(gè)接口,那么它將總能獲得該接口

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

3.客戶可以再次獲取已經(jīng)擁有的接口

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

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

如果客戶擁有一個(gè)IX接口指針,并成功地使用它來查詢了一個(gè)IY接口,那么它將可以使用這個(gè)IY接口來查詢一個(gè)IX接口,這條規(guī)則在實(shí)際的項(xiàng)目開發(fā)時(shí)很有用。

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

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

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

添加新的接口

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

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

新接口命名

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

總結(jié)

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

相關(guān)文章

  • 詳解C語言的基本數(shù)據(jù)類型

    詳解C語言的基本數(shù)據(jù)類型

    這篇文章主要為大家介紹了C語言的基本數(shù)據(jù)類型,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • C語言實(shí)現(xiàn)餐飲管理與點(diǎn)餐系統(tǒng)

    C語言實(shí)現(xiàn)餐飲管理與點(diǎn)餐系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)餐飲管理與點(diǎn)餐系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • C++中volatile限定符的實(shí)現(xiàn)示例

    C++中volatile限定符的實(shí)現(xiàn)示例

    volatile關(guān)鍵字在C和C++中用于確保編譯器不優(yōu)化特定變量的訪問,主要用于多線程和硬件交互場景,本文就來介紹C++中volatile限定符的實(shí)現(xiàn)示例,感興趣的可以了解一下
    2024-11-11
  • 哈夫曼算法構(gòu)造代碼

    哈夫曼算法構(gòu)造代碼

    這篇文章主要介紹了哈夫曼算法構(gòu)造代碼,有需要的朋友可以參考一下
    2013-12-12
  • C++如何實(shí)現(xiàn)二叉樹鏈表

    C++如何實(shí)現(xiàn)二叉樹鏈表

    這篇文章主要介紹了C++如何實(shí)現(xiàn)二叉樹鏈表,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Qt使用TabWidget實(shí)現(xiàn)多窗體功能

    Qt使用TabWidget實(shí)現(xiàn)多窗體功能

    Qt 是一個(gè)跨平臺C++圖形界面開發(fā)庫,利用Qt可以快速開發(fā)跨平臺窗體應(yīng)用程序,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,本章將重點(diǎn)介紹TabWidget標(biāo)簽組件的常用方法及靈活運(yùn)用,需要的朋友可以參考下
    2023-12-12
  • Qt中JSON使用的詳細(xì)步驟

    Qt中JSON使用的詳細(xì)步驟

    本文主要介紹了Qt中JSON使用的詳細(xì)步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • 在C++中關(guān)于友元函數(shù)的進(jìn)一步理解

    在C++中關(guān)于友元函數(shù)的進(jìn)一步理解

    今天小編就為大家分享一篇關(guān)于在C++中關(guān)于友元函數(shù)的進(jìn)一步理解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • C語言 sizeof 函數(shù)詳情

    C語言 sizeof 函數(shù)詳情

    這篇文章主要介紹了C語言 sizeof 函數(shù),在 C 語言中,char 字符串也是一種非常重要的數(shù)據(jù)類型,我們除了使用 sizeof 函數(shù)獲取字符串長度之外,使用 sizeof 函數(shù)同樣也可以完成字符串長度的獲取,下面文章內(nèi)容具體描述該內(nèi)容,需要的朋友可以參考以下
    2021-10-10
  • 詳解C++之類和對象(2)

    詳解C++之類和對象(2)

    類是創(chuàng)建對象的模板,一個(gè)類可以創(chuàng)建多個(gè)對象,每個(gè)對象都是類類型的一個(gè)變量;創(chuàng)建對象的過程也叫類的實(shí)例化。每個(gè)對象都是類的一個(gè)具體實(shí)例(Instance),擁有類的成員變量和成員函數(shù)
    2021-11-11

最新評論

德昌县| 凤庆县| 连州市| 民乐县| 揭阳市| 景德镇市| 咸丰县| 临洮县| 确山县| 昔阳县| 临朐县| 房产| 喀喇| 承德市| 西丰县| 湟中县| 河源市| 澜沧| 蚌埠市| 云安县| 安义县| 财经| 平利县| 行唐县| 葫芦岛市| 沙湾县| 台中县| 民权县| 南木林县| 京山县| 高清| 陵川县| 呼伦贝尔市| 区。| 山西省| 堆龙德庆县| 芦溪县| 上蔡县| 八宿县| 文化| 金寨县|