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

C++ COM編程之什么是接口?

 更新時(shí)間:2014年10月01日 09:52:27   作者:果凍想  
這篇文章主要介紹了C++ COM編程之什么是接口?在C++中,可以使用抽象基類(lèi)來(lái)實(shí)現(xiàn)COM接口,需要的朋友可以參考下

什么是接口?

說(shuō)到COM,就不得不說(shuō)接口了;在進(jìn)行COM開(kāi)發(fā)的過(guò)程中,可以說(shuō),我一直都在和各種各樣的接口打交道。那接口是什么?對(duì)于COM來(lái)說(shuō),接口是一個(gè)包含一個(gè)函數(shù)指針數(shù)組的內(nèi)存結(jié)構(gòu),每一個(gè)數(shù)組元素包含的是一個(gè)由組件所實(shí)現(xiàn)的函數(shù)的地址;所以,對(duì)于COM,接口就是這樣的一個(gè)內(nèi)存結(jié)構(gòu),其它東西都是一些COM并不關(guān)心的實(shí)現(xiàn)細(xì)節(jié)。

在C++中,可以使用抽象基類(lèi)來(lái)實(shí)現(xiàn)COM接口。由于一個(gè)COM組件可以支持任意數(shù)目的接口,因此對(duì)于組件,可以使用抽象基類(lèi)的多重繼承來(lái)實(shí)現(xiàn)它。

接口的好處

接口提供了兩個(gè)不同對(duì)象間的一種連接。對(duì)于客戶(hù)來(lái)說(shuō),一個(gè)組件就是一個(gè)接口集??蛻?hù)只能通過(guò)接口才能同COM組件打交道。而整體上來(lái)講,客戶(hù)對(duì)于一個(gè)組件可以說(shuō)是知之甚少;甚至在某些時(shí)候,客戶(hù)甚至不必知道一個(gè)組件所提供的所有接口,就像你進(jìn)行Windows  Shell開(kāi)發(fā)時(shí),對(duì)于一個(gè)它提供的組件,很多時(shí)候,你不可能知道所有的接口的。對(duì)于一個(gè)應(yīng)用程序而言,接口是最重要的。組件本身只不過(guò)是接口的實(shí)現(xiàn)細(xì)節(jié)。

在實(shí)際開(kāi)發(fā)時(shí),你并不需要去理會(huì)組件的實(shí)現(xiàn)細(xì)節(jié),你面對(duì)的是接口,面對(duì)接口工作。即使組件的開(kāi)發(fā)者將組件的實(shí)現(xiàn)替換掉了,而接口不變,你的程序也不需要變動(dòng)。接口,就像一個(gè)標(biāo)準(zhǔn)一樣,讓我們?nèi)プ駨倪@個(gè)標(biāo)準(zhǔn)。之前做的一個(gè)項(xiàng)目就是替換一個(gè)組件的實(shí)現(xiàn)層,而對(duì)于接口,則不需要進(jìn)行變更。

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

通過(guò)一個(gè)簡(jiǎn)單的例子來(lái)理解接口:

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

/*
** FileName     : SimpleInterfaceDemo
** Author       : Jelly Young
** Date         : 2013/12/11
** Description  : More information, please go to http://www.fzitv.net
*/
#include <iostream>
#include <combaseapi.h>
using namespace std;
interface IExample1
{
     virtual void __stdcall Fx1() = 0;
     virtual void __stdcall Fx2() = 0;
};
interface IExample2
{
     virtual void __stdcall Fy1() = 0;
     virtual void __stdcall Fy2() = 0;
};
// Implementation
class CImplementation : public IExample1, public IExample2
{
public:
     // Implementation IExample1
     void __stdcall Fx1() { cout<<"CImplementation::Fx1"<<endl; }
     void __stdcall Fx2() { cout<<"CImplementation::Fx2"<<endl; }
     // Implementation IExample2
     void __stdcall Fy1() { cout<<"CImplementation::Fy1"<<endl; }
     void __stdcall Fy2() { cout<<"CImplementation::Fy2"<<endl; }
};
// Client
int main()
{
     cout<<"Create an instance of the component."<<endl;
     CImplementation *pCImplementation = new CImplementation;
     // Get the IExample1 pointer
     IExample1 *pIExample1 = pCImplementation;
     // Use the IExample1 interface
     pIExample1->Fx1();
     pIExample1->Fx2();
     // Get the IExample2 pointer
     IExample2 *pIExample2 = pCImplementation;
     // Use the IExample2 pointer
     // Use the IExample2 interface
     pIExample2->Fy1();
     pIExample2->Fy2();
     // Destroy the component
     if (pCImplementation != NULL)
     {
          delete pCImplementation;
          pCImplementation = NULL;
          pIExample1 = NULL;
          pIExample2 = NULL;
     }
}

上面的例子中,client通過(guò)兩個(gè)接口pIExample1和pIExample2來(lái)和組件進(jìn)行通信。在聲明接口時(shí),使用了兩個(gè)純抽象基類(lèi)IX和IY??偨Y(jié)上面代碼的關(guān)鍵之處在于:

1.COM接口在C++中是用純抽象基類(lèi)實(shí)現(xiàn)的;
2.一個(gè)COM組件可以提供多個(gè)接口;
3.一個(gè)C++類(lèi)可以使用多繼承來(lái)實(shí)現(xiàn)一個(gè)可以提供多個(gè)接口的組件。

細(xì)節(jié)剖析

interface這貨是從哪里來(lái)的?你會(huì)很好奇,是不是好奇的連下巴都掉下來(lái)了?C++也有interface關(guān)鍵字?不錯(cuò),這個(gè)關(guān)鍵字是在combaseapi.h頭文件中定義的,定義如下:

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

#define __STRUCT__ struct
#define interface __STRUCT__

說(shuō)白了,就是用C++的關(guān)鍵字struct定義的一個(gè)結(jié)構(gòu)體。使用struct定義有什么好處呢?首先需要搞清楚struct和class的區(qū)別。學(xué)了Java和C#的都知道,由于接口中定義的都是允許客戶(hù)調(diào)用的,所以在接口中就不需要private和protected的了,如果使用class,而必須還要使用public關(guān)鍵字強(qiáng)調(diào)接口的公有屬性,而struct默認(rèn)的都是公有屬性,這樣就省去了添加public關(guān)鍵字的麻煩。

__stdcall是什么?__stdcall是一種用來(lái)修飾函數(shù)的關(guān)鍵字,主要約定了兩件事情:

1.參數(shù)傳遞順序,__stdcall表示參數(shù)從右向左壓入堆棧;
2.調(diào)用堆棧由誰(shuí)(調(diào)用函數(shù)或被調(diào)用函數(shù))清理,__stdcall表示由被調(diào)用函數(shù)修改堆棧。

接口是由純虛函數(shù)實(shí)現(xiàn)的,為什么是要這樣?以及展現(xiàn)出來(lái)的多態(tài),這個(gè)說(shuō)來(lái)話長(zhǎng),我將在下一篇博文中進(jìn)行總結(jié)。

總結(jié)

在這里對(duì)接口基礎(chǔ)知識(shí)進(jìn)行了掃盲式的總結(jié),而這些簡(jiǎn)單的知識(shí)點(diǎn)也是日后開(kāi)發(fā)中會(huì)經(jīng)常遇到的,這里把這些東西掌握好了,等日后開(kāi)發(fā)時(shí)也會(huì)感到很輕松。希望大家能從這篇博文中學(xué)到一定的知識(shí),同時(shí)也希望大家對(duì)我的博客提一些中肯的建議。

相關(guān)文章

  • C語(yǔ)言編寫(xiě)實(shí)現(xiàn)學(xué)生管理系統(tǒng)

    C語(yǔ)言編寫(xiě)實(shí)現(xiàn)學(xué)生管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言編寫(xiě)實(shí)現(xiàn)學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • OpenCV實(shí)現(xiàn)傾斜文字校正

    OpenCV實(shí)現(xiàn)傾斜文字校正

    這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)傾斜文字校正,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C++中sprintf()函數(shù)的使用詳解

    C++中sprintf()函數(shù)的使用詳解

    本篇文章是對(duì)C++中sprintf()函數(shù)的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C語(yǔ)言練習(xí)之掃雷小游戲

    C語(yǔ)言練習(xí)之掃雷小游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言練習(xí)之掃雷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • C++中使用正則匹配問(wèn)題

    C++中使用正則匹配問(wèn)題

    這篇文章主要介紹了C++中使用正則匹配問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 基于C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易掃雷游戲

    基于C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了基于C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下<BR>
    2022-01-01
  • C語(yǔ)言限制鏈表最大長(zhǎng)度的方法實(shí)現(xiàn)

    C語(yǔ)言限制鏈表最大長(zhǎng)度的方法實(shí)現(xiàn)

    本文主要介紹了C語(yǔ)言中限制鏈表的長(zhǎng)度,通過(guò)在添加新元素時(shí)檢查鏈表的當(dāng)前長(zhǎng)度是否已經(jīng)達(dá)到預(yù)設(shè)的最大值來(lái)實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-03-03
  • Qt 儀表盤(pán)的實(shí)現(xiàn)示例

    Qt 儀表盤(pán)的實(shí)現(xiàn)示例

    儀表盤(pán)在很多汽車(chē)和物聯(lián)網(wǎng)相關(guān)的系統(tǒng)中很常用,本文就來(lái)介紹一下Qt 儀表盤(pán)的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • C++入門(mén)到精通之循環(huán)語(yǔ)句的使用教程

    C++入門(mén)到精通之循環(huán)語(yǔ)句的使用教程

    這篇文章主要給大家介紹了關(guān)于C++中循環(huán)語(yǔ)句的用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • 深入解析C++ Data Member內(nèi)存布局

    深入解析C++ Data Member內(nèi)存布局

    本篇文章是對(duì)C++中的Data Member內(nèi)存布局進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-07-07

最新評(píng)論

镶黄旗| 肇东市| 汉中市| 娄烦县| 武鸣县| 长葛市| 修文县| 南川市| 荔波县| 罗甸县| 建宁县| 中宁县| 翁源县| 绍兴县| 永仁县| 安福县| 买车| 青州市| 罗甸县| 迁西县| 公主岭市| 朔州市| 大石桥市| 中山市| 江达县| 大洼县| 包头市| 车致| 福清市| 长垣县| 海盐县| 宁陵县| 徐闻县| 陇川县| 南召县| 靖江市| 左权县| 江川县| 张家界市| 梨树县| 长白|