日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

IUnknown接口QueryInterface函数介绍

發布時間:2023/12/9 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IUnknown接口QueryInterface函数介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、COM組件的目標:

COM組件的一個主要優勢是:便于升級。

要實現這個優勢需要滿足一下兩個條件:

1、運行時從客戶程序動態加載和卸載,采用DLL技術可以實現。

2、為了更好的突出DLL的優勢,還需要信息隱藏,即封裝性。

?

二、COM組件的信息隱藏采用IUnknown接口來實現:

?????? 1、IUnknown接口功能簡介:

IUnknown意思是未知,即未知的接口。采用這個名字是為了簡單起見,所有的COM接口都需要繼承IUnknown,因此若某個客戶擁有一個IUnknown接口的指針,也就不知道接口到底是什么類型的,只需要知道此接口可以用來查詢其他接口。IUnknown接口有一個用來查詢接口的函數QueryInterface。由于所有的COM組件接口都從IUnknown接口繼承,因此所有的接口都有QueryInterface函數,通過QueryInterface可以查詢到任何接口,因此也就不需要單獨維護一個代表組件的指針。

?????? 2、QueryInterface功能簡介:

客戶可以通過IUnknown中包含的QueryInterface函數查詢某個組件是否支持某個特定的接口。

若支持,QueryInterface將返回指向此接口的指針。

否則,將返回一個錯誤代碼。

然后,客戶可以接著查詢其它接口或將組件卸載。

3、QueryInterface函數遵循的規則:

QueryInterface的實現需要遵循一些規則,以便于客戶能夠獲取關于組件的足夠多的知識并對之實施一些控制和其他有用的處理。QueryInterface的行為必須是穩定的。

<1>、QueryInterface返回IUnknown接口時,總是返回同一IUnknown指針。

每個組件實例只有一個IUnknown接口,因此當查詢組件實例的IUnknown接口時,不論通過那個接口查詢,得到的均將是同一指針值。

總結:遵循這一規則能確定兩個接口是否指向同一組件。

<2>、客戶可以獲取曾經得到過的接口。

若對于某個給定的接口,QueryInterface曾經成功過,那么對于同一組件的后續QueryInterface將總是成功的。

總結:若不遵循這一規則客戶將無法通過編程的方法來決定組件到底有一些什么樣的功能。

??? ?<3>、 可以再次獲取已經擁有的接口,即通過A接口查詢A接口指針。

<4>、 客戶可以從任何接口返回到起始接口,即若通過A接口可以查詢到B接口,那么可以通過B接口查詢到A接口(對稱性)。

<5>、若能夠從某接口獲取到某特定的接口,則從任意的接口都將能獲取此接口(傳遞性)。

?? ????若可以從A接口查詢到B接口,從B接口查詢到C接口,那么可以從A接口查詢到C接口。

?? ????總結:這條規則使得QueryInterface是可用的,即某接口的查詢不是必須依賴于某個接口查詢。

?

總結:COM為QueryInterface制定上述規則的目的使為了使QueryInterface使用起來更為簡單、更富有邏輯性、更一致及更具確定性。

QueryInterface定義了組件,因此是COM最為重要的部分。組件所支持的接口集就是QueryInterface能夠返回接口指針的那些接口。

三、COM組件新舊版本的處理:

COM組件一旦發布出去,接口將永遠保持不變。接口不變是指不能改變接口(IID),但是可以建立一個新的接口(同時再為接口指定一個新的IID)。

??? 1、COM組件對新舊版本的處理機制:

當QueryInterface接受到對老IID查詢時,返回老的接口。

接收到對新的IID的查詢時,它將返回新的接口查詢。

對QueryInterface而言,一個IID就是一個接口,所以同某個IID相應的接口絕不會發生變化。

對于老的接口仍然保持不變,因此已有客戶的運行將不會受到任何影響。

對于新客戶則可以自行決定使用老接口還是新接口。

這種處理多個版本的方法最有效的地方在于它是無縫的。客戶不需要做任何附加的動作,因為接口的標志符同其版本是完全綁定在一塊的。

2、建立一個新版本的時機:

為了使COM處理多個版本的機制能夠起作用,當下列條件中的任何一個改變時,就應給新接口指定新的IID:

<1>、接口中函數的數目。

<2>、接口中函數的順序。

<3>、某個函數的參數。

<4>、某個函數的參數順序。

<5>、某個函數的參數類型。

<6>、函數可能的返回值。

<7>、函數返回值的類型。

<8>、函數參數的含義。

<9>、接口中函數的含義。

總結:只要是所做的修改為導致已有客戶的正常運行,都應為接口指定新的IID。

http://www.cnblogs.com/iameasy_man/archive/2009/10/11/1580824.html

轉載于:https://www.cnblogs.com/newlist/archive/2012/07/05/2577741.html

總結

以上是生活随笔為你收集整理的IUnknown接口QueryInterface函数介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。