C++ COM編程之QueryInterface函數(二)。本站提示廣大學習愛好者:(C++ COM編程之QueryInterface函數(二))文章只能為提供參考,不一定能成為您想要的結果。以下是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停止具體的總結。願望對年夜家有必定的贊助,最初,也願望年夜家提出你的設法主意和我分享。我深信,交換是一種異常給力的進修辦法。