IUnknown接口QueryInterface函数介绍
一、COM組件的目標:
COM組件的一個主要優(yōu)勢是:便于升級。
要實現(xiàn)這個優(yōu)勢需要滿足一下兩個條件:
1、運行時從客戶程序動態(tài)加載和卸載,采用DLL技術(shù)可以實現(xiàn)。
2、為了更好的突出DLL的優(yōu)勢,還需要信息隱藏,即封裝性。
?
二、COM組件的信息隱藏采用IUnknown接口來實現(xiàn):
?????? 1、IUnknown接口功能簡介:
IUnknown意思是未知,即未知的接口。采用這個名字是為了簡單起見,所有的COM接口都需要繼承IUnknown,因此若某個客戶擁有一個IUnknown接口的指針,也就不知道接口到底是什么類型的,只需要知道此接口可以用來查詢其他接口。IUnknown接口有一個用來查詢接口的函數(shù)QueryInterface。由于所有的COM組件接口都從IUnknown接口繼承,因此所有的接口都有QueryInterface函數(shù),通過QueryInterface可以查詢到任何接口,因此也就不需要單獨維護一個代表組件的指針。
?????? 2、QueryInterface功能簡介:
客戶可以通過IUnknown中包含的QueryInterface函數(shù)查詢某個組件是否支持某個特定的接口。
若支持,QueryInterface將返回指向此接口的指針。
否則,將返回一個錯誤代碼。
然后,客戶可以接著查詢其它接口或?qū)⒔M件卸載。
3、QueryInterface函數(shù)遵循的規(guī)則:
QueryInterface的實現(xiàn)需要遵循一些規(guī)則,以便于客戶能夠獲取關(guān)于組件的足夠多的知識并對之實施一些控制和其他有用的處理。QueryInterface的行為必須是穩(wěn)定的。
<1>、QueryInterface返回IUnknown接口時,總是返回同一IUnknown指針。
每個組件實例只有一個IUnknown接口,因此當(dāng)查詢組件實例的IUnknown接口時,不論通過那個接口查詢,得到的均將是同一指針值。
總結(jié):遵循這一規(guī)則能確定兩個接口是否指向同一組件。
<2>、客戶可以獲取曾經(jīng)得到過的接口。
若對于某個給定的接口,QueryInterface曾經(jīng)成功過,那么對于同一組件的后續(xù)QueryInterface將總是成功的。
總結(jié):若不遵循這一規(guī)則客戶將無法通過編程的方法來決定組件到底有一些什么樣的功能。
??? ?<3>、 可以再次獲取已經(jīng)擁有的接口,即通過A接口查詢A接口指針。
<4>、 客戶可以從任何接口返回到起始接口,即若通過A接口可以查詢到B接口,那么可以通過B接口查詢到A接口(對稱性)。
<5>、若能夠從某接口獲取到某特定的接口,則從任意的接口都將能獲取此接口(傳遞性)。
?? ????若可以從A接口查詢到B接口,從B接口查詢到C接口,那么可以從A接口查詢到C接口。
?? ????總結(jié):這條規(guī)則使得QueryInterface是可用的,即某接口的查詢不是必須依賴于某個接口查詢。
?
總結(jié):COM為QueryInterface制定上述規(guī)則的目的使為了使QueryInterface使用起來更為簡單、更富有邏輯性、更一致及更具確定性。
QueryInterface定義了組件,因此是COM最為重要的部分。組件所支持的接口集就是QueryInterface能夠返回接口指針的那些接口。
三、COM組件新舊版本的處理:
COM組件一旦發(fā)布出去,接口將永遠保持不變。接口不變是指不能改變接口(IID),但是可以建立一個新的接口(同時再為接口指定一個新的IID)。
??? 1、COM組件對新舊版本的處理機制:
當(dāng)QueryInterface接受到對老IID查詢時,返回老的接口。
接收到對新的IID的查詢時,它將返回新的接口查詢。
對QueryInterface而言,一個IID就是一個接口,所以同某個IID相應(yīng)的接口絕不會發(fā)生變化。
對于老的接口仍然保持不變,因此已有客戶的運行將不會受到任何影響。
對于新客戶則可以自行決定使用老接口還是新接口。
這種處理多個版本的方法最有效的地方在于它是無縫的??蛻舨恍枰鋈魏胃郊拥膭幼?#xff0c;因為接口的標志符同其版本是完全綁定在一塊的。
2、建立一個新版本的時機:
為了使COM處理多個版本的機制能夠起作用,當(dāng)下列條件中的任何一個改變時,就應(yīng)給新接口指定新的IID:
<1>、接口中函數(shù)的數(shù)目。
<2>、接口中函數(shù)的順序。
<3>、某個函數(shù)的參數(shù)。
<4>、某個函數(shù)的參數(shù)順序。
<5>、某個函數(shù)的參數(shù)類型。
<6>、函數(shù)可能的返回值。
<7>、函數(shù)返回值的類型。
<8>、函數(shù)參數(shù)的含義。
<9>、接口中函數(shù)的含義。
總結(jié):只要是所做的修改為導(dǎo)致已有客戶的正常運行,都應(yīng)為接口指定新的IID。
http://www.cnblogs.com/iameasy_man/archive/2009/10/11/1580824.html
轉(zhuǎn)載于:https://www.cnblogs.com/newlist/archive/2012/07/05/2577741.html
總結(jié)
以上是生活随笔為你收集整理的IUnknown接口QueryInterface函数介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 点击User Profile Servi
- 下一篇: android wifi