亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

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

2020-05-23 14:21:01
字體:
供稿:網(wǎng)友
這篇文章主要介紹了C++ COM編程之QueryInterface函數(shù)(一),QueryInterface是組件本身提供對自己查詢的一個(gè)接口,需要的朋友可以參考下
 
 

前言

組件對外公布的是接口;一個(gè)組件可以實(shí)現(xiàn)多個(gè)接口,也就是說可以對外公布多個(gè)接口,之前也總結(jié)過了,你很少會100%的去完全了解一個(gè)組件的所有接口,就像你去學(xué)習(xí)編程一樣,你幾乎不可能去成為編程中的全才。那么,既然我們不能去完全的了解一個(gè)組件提供的所有接口,那么我們在實(shí)際開發(fā)中,如何去判斷一個(gè)組件是否提供對應(yīng)的接口呢?看文檔?是的,是個(gè)好主意,在文檔的海洋,找到一個(gè)知識點(diǎn),真的很難,浪費(fèi)時(shí)間和精力;其實(shí),組件本身就提供對自己查詢的一個(gè)接口,讓客戶去詢問組件,問它是否支持某個(gè)接口,在經(jīng)過多次的這種詢問之后,客戶對于組件的認(rèn)識將越來越清晰;而我這篇文章和下一篇文章就是對這種詢問機(jī)制進(jìn)行詳細(xì)的剖析和總結(jié)。

關(guān)于IUnknown

上面說到組件本身提供一個(gè)對自己查詢的接口,那么這個(gè)接口是什么呢?這就是大名鼎鼎的IUnknown接口了,IUnknown接口在Windows SDK的unknwn.h中定義,它的定義如下:

 

復(fù)制代碼代碼如下:

interface IUnknown
{
public:
    virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, _COM_Outptr_  void **ppvObject) = 0;
    virtual ULONG STDMETHODCALLTYPE AddRef( void) = 0;
    virtual ULONG STDMETHODCALLTYPE Release( void) = 0;
};

 

這里的STDMETHODCALLTYPE表示調(diào)用方式,也就是windows API的__stdcall方式。可以看到,在IUnknown中定義了一個(gè)名為QueryInterface的函數(shù)??蛻艨梢哉{(diào)用QueryInterface來判斷組件是否支持某個(gè)特定的接口,而對于剩下的AddRef和Release兩個(gè)接口操作,我會在之后的文章中進(jìn)行總結(jié)。

所有的COM接口都需要繼承IUnknown接口;因此,如果某個(gè)客戶擁有一個(gè)IUnknown接口的指針,它并不需要知道它所擁有的接口指針到底是指向什么類型的,而只需要知道此接口可以用來查詢其它接口就行了。

由于所有的COM接口都首先繼承了IUnknown,再根據(jù)對之前的文章COM編程——接口的背后 的理解,我們可以知道每個(gè)接口的vtbl中的前三個(gè)函數(shù)都是QueryInterface,AddRef和Release。這就使得所有的COM接口都可以被當(dāng)成IUnknown接口來處理。如果某個(gè)接口的vtbl中的前三個(gè)函數(shù)不是這三個(gè),那么它將不是一個(gè)COM接口。由于所有的接口都是從IUnknown繼承而來的,因此所有的接口都支持QueryInterface。所以,組件的任何一個(gè)接口都可以被客戶用來獲取它所支持的其他接口。由于所有的接口指針同時(shí)也將是IUnknown指針,客戶并不需要單獨(dú)維護(hù)一個(gè)代表組件的指針,它所關(guān)心的將僅僅是接口的指針。

既然,我們可以只用QueryInterface去詢問組件是否支持某個(gè)接口,但是,這一切都是基于獲得了IUnknown接口指針之后,才能進(jìn)行的操作,那么如何獲得一個(gè)指向組件的IUnknown接口指針呢?我們可以實(shí)現(xiàn)一個(gè)CreateInstance函數(shù),它建立一個(gè)組件并返回一個(gè)IUnknown指針;對于客戶來說,可以調(diào)用CreateInstance獲得IUnknown指針,而不用使用new操作符了。在系統(tǒng)的總結(jié)了COM的所有基礎(chǔ)知識之后,我再說說系統(tǒng)提供的一個(gè)創(chuàng)建組件實(shí)例的API函數(shù)。

關(guān)于QueryInterface

IUnknown中包含一個(gè)名為QueryInterface的成員函數(shù),客戶可以通過此函數(shù)來查詢某個(gè)組件是否支持某個(gè)特定的接口。若支持,QueryInterface將返回一個(gè)指向此接口的指針;否則返回值將是一個(gè)錯誤代碼;然后客戶可以接著查詢其它接口。

從QueryInterface函數(shù)的聲明中可以看出,QueryInterface有兩個(gè)參數(shù),第一個(gè)參數(shù)標(biāo)識客戶所需的接口,這個(gè)參數(shù)是一個(gè)接口標(biāo)識符(IID)結(jié)構(gòu),在之后的文章中,我會總結(jié)有關(guān)IID的知識的;第二個(gè)參數(shù)用來存放所請求的接口的地址。QueryInterface返回的是一個(gè)HRESULT值,它是一個(gè)具有特定結(jié)構(gòu)的32位值,之后我也會進(jìn)行總結(jié)的;對于返回的HRESULT值,在實(shí)際開發(fā)中,需要使用SUCCEEDED宏或FAILED宏去進(jìn)行判斷HRESULT值是表示成功還是失敗。

QueryInterface的簡單實(shí)現(xiàn)

總結(jié)了QueryInterface的簡單實(shí)現(xiàn),說白了,就是簡單工廠模式的實(shí)現(xiàn);上面也說了,就是根據(jù)客戶提供的IID接口標(biāo)識符,然后獲得對應(yīng)的接口的指針,返回對應(yīng)的接口的指針;如果組件支持客戶指定的接口,那么應(yīng)返回S_OK以及相應(yīng)的指針;若不支持,返回值應(yīng)是E_NOINTERFACE,并將相應(yīng)的指針返回值置成NULL。下面通過一個(gè)簡單的例子來說明QueryInterface的簡單實(shí)現(xiàn):

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

比如有上述的一個(gè)結(jié)構(gòu);接口IX和IY都繼承自IUnknown接口,組件CA實(shí)現(xiàn)了IX和IY接口,那么QueryInterface的實(shí)現(xiàn)應(yīng)該像下面這樣:

 

復(fù)制代碼代碼如下:

HRESULT __stdcall CA::QueryInterface(const IID &iid, void **ppv)
{
     if (iid == IID_IUnknown)
     {
          *ppv = static_cast<IX *>(this);
     }
     else if (iid == IID_IX)
     {
          *ppv = static_cast<IX *>(this);
     }
     else if (iid == IID_IY)
     {
          *ppv = static_cast<IY *>(this);
     }
     else
     {
          *ppv = NULL;
          return E_NOINTERFACE;
     }
     static_cast<IUnknown *>(*ppv)->AddRef();
     return S_OK;
}

 

QueryInterface的簡單使用

當(dāng)我獲得了一個(gè)IUnknown指針以后,就可以調(diào)用對應(yīng)的QueryInterface進(jìn)行查詢了,如下:

復(fù)制代碼代碼如下:

void Fod(IUnknown *pI)
{
     IX *pIX = NULL;
     // Ask for interface IX
     HRESULT hr = pI->QueryInterface(IID_IX, (void **)&pIX);
     // Check the return value
     if (SUCCEEDED(hr))
     {
          // Use the interface
          pIX->Fx();
     }    
}

 

完整的例子

上面說了那么多了,現(xiàn)在提供一個(gè)完整的例子,將上面的各種理論知識都在實(shí)際代碼中進(jìn)行了實(shí)踐,讓各位能更好的理解QueryInterface。(下載)。

總結(jié)

QueryInterface理解起來比較簡單,但是,它的理論知識還是必須要去掌握的,理論是一切的基礎(chǔ),沒有理論作為支撐,任何實(shí)際的操作都不會那么可靠和可信,所以,這篇文章總結(jié)的偏于理論多一些。由于QueryInterface部分的內(nèi)容比較多,使用一篇文章無法總結(jié)的齊全,所以,之后我還會繼續(xù)總結(jié)關(guān)于QueryInterface的第二部分。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
国产福利微拍精品一区二区| 日本ー区在线视频| 俺来俺也去www色在线观看| 你懂的视频在线看| 日韩午夜精品电影| 国产在线高清精品| 成人免费网站在线观看| 欧美图片欧美激情欧美精品| 美腿丝袜亚洲图片| 亚洲欧美一区二区三| 日韩精品一卡二卡三卡四卡无卡| 青青草原国产在线观看| av中文字幕在线观看| 九色精品高清在线播放| 国产精品一二三在| 国产一区二区三区四区五区加勒比| 欧美亚洲图片小说| 中文字字幕码一二三区| 日韩成人av在线资源| 久久久九九九九| 欧美日韩在线观看不卡| 欧美精品第一区| 久久色视频免费观看| 久久er热在这里只有精品66| 天天干 夜夜操| 亚洲国产99精品国自产| 九九热在线免费视频| 免费在线黄网| 国产精品三区在线| 国产一级特黄视频| 国产一区二区三区色淫影院| 欧美精品乱码久久久久久| 91在线视频| 最新av免费在线观看| 日韩在线视频线视频免费网站| 日本v片在线高清不卡在线观看| 亚洲制服欧美中文字幕中文字幕| 中文字幕二区三区| 激情视频在线观看一区二区三区| 在线观看亚洲视频啊啊啊啊| 国产精品一区二区免费在线观看| 狠狠综合久久av一区二区| 欧美专区18| 天天干天天操av| 中文在线免费一区三区高中清不卡| 亚洲黄色小视频| 一二三四视频社区在线| 国产精品91一区二区三区| 丁香花免费高清完整在线播放| 波多野结衣中文在线| 欧美日韩国产成人精品| av网站免费观看| 婷婷综合久久一区二区三区| 夜色资源网av在先锋网站观看| 又色又爽又黄无遮挡的免费视频| 日韩影片中文字幕| 欧美专区第一页| 亚洲欧美一区二区三| 精品无码久久久久久久动漫| www一区二区三区| 777久久精品一区二区三区无码| gogogo免费视频观看亚洲一| www.亚洲.com| 国产精品人成电影| 国产成人无码一区二区在线播放| 久久露脸国语精品国产91| 久久久久久久久网站| 久久久久99精品一区| 亚洲午夜精品久久久久久高潮| 在线成人直播| 欧美韩国日本一区| 五月婷婷激情综合| 七七婷婷婷婷精品国产| 视频一区二区三区入口| 亚洲成年人在线观看| 视频免费一区| 精品午夜福利视频| 欧美最猛性xxxxx喷水| 国产精品精品国产色婷婷| 亚洲国产精品久久久久久久| 性生生活大片免费看视频| 日韩精品一区在线视频| 午夜无码国产理论在线| jizz国产在线| 中文字幕在线观看日韩| 欧美精品久久一区二区| 国产激情综合| 91沈先生在线观看| 日韩aaaa| 日韩国产小视频| 国产欧美一区二区精品性色超碰| 天堂中文资源在线观看| 韩国三级电影久久久久久| freemovies性欧美| 好吊色欧美一区二区三区四区| 国产精品国产a| 成人羞羞网站入口| 国产免费av一区二区| 青青国产视频| 久在线观看福利视频| 精品三级久久久久久久电影聊斋| 成人午夜在线观看| 在线激情av| 国内精品亚洲| 国产精品久久看| 久久久久久久久久91| 午夜影院日韩| 日本黄色中文字幕| 糖心vlog免费在线观看| 中文字幕日本不卡| 久久精品国产精品国产精品污| 亚洲国产高清一区二区三区| 免费看国产黄色片| 久久国产精品72免费观看| 看女生喷水的网站在线观看| 成人av小说网| 一级精品视频在线观看宜春院| 天天操天天爱天天干| 九九热最新地址| 国产拍揄自揄精品视频麻豆| 女同视频在线观看| 亚洲图片制服诱惑| 一区二区电影免费观看| 色欧美在线观看| 老熟妇仑乱视频一区二区| 四虎.com| 国产极品美女高潮无套嗷嗷叫酒店| jizzjizzjizzjizz日本老师| 在线免费观看欧美| 无码人妻aⅴ一区二区三区| 亚洲黄色av网址| av一区在线观看| 亚洲精品无播放器在线播放| 一本一道dvd在线观看免费视频| chinese叫床对白videos| av在线免费电影| 日韩欧美在线网站| 亚洲成人福利在线| 丝袜a∨在线一区二区三区不卡| 久久中国妇女中文字幕| 亚洲成人精品| 美女视频黄 久久| 粉嫩欧美一区二区三区高清影视| 欧美日韩二三区| 亚洲三级在线免费观看| eeuss影院www| 日韩在线一区二区三区| 天天色棕合合合合合合合| 亚洲国产精品一区在线观看不卡| 一本久久综合| 国产又粗又黄又爽的视频| 九九精品视频在线| 狠狠久久综合婷婷不卡| www.免费黄色| 亚洲精品成人久久久| 26uuu国产在线精品一区二区| 2021国产精品视频| 亚洲小说图片| 人妻91麻豆一区二区三区| 亚洲一区二区三区四区电影| 北条麻妃一区二区三区中文字幕| 日韩在线一区二区三区免费视频| 久久都是精品| 国产日韩三级在线| 蜜臀av性久久久久蜜臀aⅴ四虎| 亚洲免费激情视频| 成年人视频在线观看免费| 久久天堂av综合合色蜜桃网| 中文字幕另类日韩欧美亚洲嫩草| 久久精品视频国产| 欧美日韩国产欧| 精品久久在线观看| 蜜臀久久99精品久久久久久宅男| 成人激情在线播放| av在线亚洲男人的天堂| 高清国产午夜精品久久久久久| 国产欧美日韩另类一区| 亚洲精品在线免费观看视频| 日韩欧美伦理电影院| 精品久久久久久久久久久久久久久久久久| 不卡毛片在线看| 国产高清免费在线观看| 国产福利精品一区二区| 一本一道久久a久久综合蜜桃| 男人添女人下面高潮视频| 国产高清美女一级毛片久久| 警花av一区二区三区| 久久久久久久久久久久久久国产| 国产成人精品自线拍| 亚洲福利网站| 日韩高清在线一区| 精品国产乱码久久久久久影片| 久久丫精品忘忧草西安产品| 亚洲天堂av免费在线观看| 久久久久香蕉视频| 无码人妻少妇色欲av一区二区| 国产剧情av在线播放| 午夜国产福利一区二区| 草草草在线视频| 99热在线网站| 91好吊色国产欧美日韩在线| 日韩深夜影院| 亚洲国产又黄又爽女人高潮的| 亚洲高清资源综合久久精品| 97精品国产露脸对白| 伊人在线视频| 91黄色8090| 爽爽爽在线观看| 国产+成+人+亚洲欧洲在线| 久激情内射婷内射蜜桃| 欧洲精品一区二区三区在线观看| 日本黄色三级视频| 成人羞羞视频在线看网址| 韩国中文字幕hd久久精品| 国产免费拔擦拔擦8x在线播放| 日韩av网站在线观看| 四虎国产精品永远| 成人免费视频国产在线观看| 国产无遮挡裸体免费视频| 一道本视频在线观看| 欧美freesextv| 亚洲国产精品va在线看黑人| 十九岁完整版在线观看好看云免费| 亚洲精品视频在线免费| 亚洲桃色综合影院| 亚洲成人av片在线观看| 5566成人精品视频免费| 久久久久免费精品| 欧美激情综合网| 国产精品久久久久久久久久辛辛| 91国产丝袜在线放| 成人片在线播放| 成人小视频在线观看免费| 国内精品免费午夜毛片| 国产偷国产偷亚洲清高网站| 亚洲视频一区在线| 免费看毛片的网址| 蜜桃av一区二区三区| 99在线免费视频观看| 欧美色图久久| 97电影在线观看| 天天操综合网| 久久精品一本| 成人精品gif动图一区| 久久久pmvav| 看国产成人h片视频| 韩国女主播成人在线| 波多野结衣在线免费观看| 国产国语videosex另类| 最近中文字幕免费视频| 国产精品五区| 极品盗摄国产盗摄合集| 91 在线视频观看| 777久久精品一区二区三区无码| 亚洲伊人成人网| 不卡一卡二卡三乱码免费网站| 精品一区二区三区的国产在线观看| 亚洲精品久久久久久久久久久久| 国产卡二和卡三的视频| jizz在线视频| 精品夜夜澡人妻无码av| 绯色av一区二区| 欧美女子与性| 中国china体内裑精亚洲片| 成人精品鲁一区一区二区| 九九视频直播综合网| 青青草福利视频| 国产精品18| 啪啪免费网站| 中文字幕资源站| 亚洲欧洲av在线| 美脚丝袜一区二区三区在线观看| 亚洲女同性videos| 2019亚洲日韩新视频| 国产福利精品一区| av动漫在线看| 色屁屁www国产馆在线观看| 麻豆精品国产传媒av| 国产一区二区三区日韩| 国产欧美短视频| 精品国产av 无码一区二区三区| 不卡的一区二区| 免费三级在线观看| 影音先锋国产在线| av资源新版天堂在线| 女女同性女同一区二区三区按摩| 无码av免费一区二区三区试看| 日本三级中文字幕在线观看| 成人综合电影| 免费在线观看黄| 拍拍拍无挡免费播放视频在线观看| 亚洲精品久久视频| 日韩a在线观看| 最新热久久免费视频| 欧美性xxxxx极品| 亚洲一区二区三区四区视频| 精品视频在线观看网站| 国色天香久久精品国产一区| 麻豆mv在线看| 亚洲电影免费观看高清完整版在线| 欧美日韩精品专区| 亚洲免费观看高清完整版在线观看| 国产色产综合色产在线视频| 激情另类小说区图片区视频区| 国产美女扒开尿口久久久| 亚洲综合五月天| 国产真实久久| 911精品国产一区二区在线| 一级黄色毛毛片| 8x8x拔插拔插影库永久免费| wwwxxx黄色片| 三级av网站| 欧美精品日韩一本| 免费精品视频最新在线| 99热播精品免费| 99久久精品费精品国产| 777777777亚洲妇女| 女人成午夜大片7777在线| 污黄网站在线观看| 色综合久久久久久久久五月| 色丁香久综合在线久综合在线观看| 国产精品无码99re| 51xx午夜影福利| 男女激情视频一区| 久久国产精品二区| 欧美日韩免费在线视频| 国产日韩视频在线播放| 亚洲传媒在线|