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

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

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

2020-05-23 14:21:11
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了C++ COM編程之什么是接口?在C++中,可以使用抽象基類來實現COM接口,需要的朋友可以參考下
 
 

什么是接口?

說到COM,就不得不說接口了;在進行COM開發的過程中,可以說,我一直都在和各種各樣的接口打交道。那接口是什么?對于COM來說,接口是一個包含一個函數指針數組的內存結構,每一個數組元素包含的是一個由組件所實現的函數的地址;所以,對于COM,接口就是這樣的一個內存結構,其它東西都是一些COM并不關心的實現細節。

在C++中,可以使用抽象基類來實現COM接口。由于一個COM組件可以支持任意數目的接口,因此對于組件,可以使用抽象基類的多重繼承來實現它。

接口的好處

接口提供了兩個不同對象間的一種連接。對于客戶來說,一個組件就是一個接口集??蛻糁荒芡ㄟ^接口才能同COM組件打交道。而整體上來講,客戶對于一個組件可以說是知之甚少;甚至在某些時候,客戶甚至不必知道一個組件所提供的所有接口,就像你進行Windows  Shell開發時,對于一個它提供的組件,很多時候,你不可能知道所有的接口的。對于一個應用程序而言,接口是最重要的。組件本身只不過是接口的實現細節。

在實際開發時,你并不需要去理會組件的實現細節,你面對的是接口,面對接口工作。即使組件的開發者將組件的實現替換掉了,而接口不變,你的程序也不需要變動。接口,就像一個標準一樣,讓我們去遵從這個標準。之前做的一個項目就是替換一個組件的實現層,而對于接口,則不需要進行變更。

簡單的實現

通過一個簡單的例子來理解接口:

 

復制代碼代碼如下:

/*
** FileName     : SimpleInterfaceDemo
** Author       : Jelly Young
** Date         : 2013/12/11
** Description  : More information, please go to http://www.49028c.com
*/
#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通過兩個接口pIExample1和pIExample2來和組件進行通信。在聲明接口時,使用了兩個純抽象基類IX和IY。總結上面代碼的關鍵之處在于:

1.COM接口在C++中是用純抽象基類實現的;
2.一個COM組件可以提供多個接口;
3.一個C++類可以使用多繼承來實現一個可以提供多個接口的組件。

細節剖析

interface這貨是從哪里來的?你會很好奇,是不是好奇的連下巴都掉下來了?C++也有interface關鍵字?不錯,這個關鍵字是在combaseapi.h頭文件中定義的,定義如下:

復制代碼代碼如下:

#define __STRUCT__ struct
#define interface __STRUCT__

 

說白了,就是用C++的關鍵字struct定義的一個結構體。使用struct定義有什么好處呢?首先需要搞清楚struct和class的區別。學了Java和C#的都知道,由于接口中定義的都是允許客戶調用的,所以在接口中就不需要private和protected的了,如果使用class,而必須還要使用public關鍵字強調接口的公有屬性,而struct默認的都是公有屬性,這樣就省去了添加public關鍵字的麻煩。

__stdcall是什么?__stdcall是一種用來修飾函數的關鍵字,主要約定了兩件事情:

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

接口是由純虛函數實現的,為什么是要這樣?以及展現出來的多態,這個說來話長,我將在下一篇博文中進行總結。

總結

在這里對接口基礎知識進行了掃盲式的總結,而這些簡單的知識點也是日后開發中會經常遇到的,這里把這些東西掌握好了,等日后開發時也會感到很輕松。希望大家能從這篇博文中學到一定的知識,同時也希望大家對我的博客提一些中肯的建議。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩在线观看网址| 国产成一区二区| 欧美最猛性xxxxx亚洲精品| 亚洲电影免费观看高清完整版在线观看| 亚洲一级黄色av| 精品视频一区在线视频| 久久影院中文字幕| 欧美国产在线电影| 亚洲香蕉成人av网站在线观看| 国产精品美乳一区二区免费| 日韩av综合网| 久久精品视频在线| 深夜福利亚洲导航| 久久精品国产一区二区电影| 亚洲国产精品va在线观看黑人| 77777亚洲午夜久久多人| 高清亚洲成在人网站天堂| 亚洲午夜性刺激影院| 久久精品国产免费观看| 午夜精品一区二区三区视频免费看| 国产激情视频一区| 亚洲精品影视在线观看| 韩剧1988在线观看免费完整版| 国产精品视频白浆免费视频| 国产99久久精品一区二区 夜夜躁日日躁| 久久免费国产视频| 亚洲国产97在线精品一区| 欧美激情在线狂野欧美精品| 青青久久av北条麻妃海外网| 欧美一级片一区| 国产亚洲人成a一在线v站| 亚洲第一精品夜夜躁人人爽| 国内外成人免费激情在线视频| 国产精品久久久久久久久久小说| 亚洲人免费视频| 岛国av午夜精品| 有码中文亚洲精品| 97**国产露脸精品国产| 欧美乱妇高清无乱码| 国产亚洲精品久久久久久777| 欧美日韩亚洲91| 91深夜福利视频| 精品亚洲一区二区| 日韩美女视频免费看| 色视频www在线播放国产成人| 国产成人免费av| 91夜夜揉人人捏人人添红杏| 久操成人在线视频| 久久精品国产一区| 日韩精品视频三区| 日韩成人在线视频| 欧美极品少妇xxxxⅹ免费视频| 成人黄色在线免费| 日韩免费视频在线观看| 欧美精品videossex88| 97**国产露脸精品国产| 91精品国产91久久久久久最新| 色老头一区二区三区在线观看| 日韩人体视频一二区| 国产精品男女猛烈高潮激情| 色七七影院综合| 96sao精品视频在线观看| 亚洲第一二三四五区| 5566日本婷婷色中文字幕97| 在线观看欧美成人| 日韩专区在线播放| 国产精品h在线观看| 日韩成人av网| 亚洲免费福利视频| 欧美成人午夜免费视在线看片| 国产成人久久久精品一区| 欧美巨大黑人极品精男| 国产精品视频不卡| 2019中文在线观看| 国产欧美久久一区二区| 日韩中文在线不卡| 欧美成人免费在线视频| 久久亚洲国产精品成人av秋霞| 久久久久久午夜| 久久6精品影院| 久久免费福利视频| 日韩午夜在线视频| 久久av红桃一区二区小说| 国产福利视频一区二区| 日韩最新中文字幕电影免费看| 午夜精品一区二区三区在线视频| 亚洲天堂免费视频| 久久国产加勒比精品无码| 国产成人福利夜色影视| 欧美日韩亚洲精品一区二区三区| 亚洲精品suv精品一区二区| 久久久久一本一区二区青青蜜月| 欧美一级淫片aaaaaaa视频| 国产午夜精品麻豆| 欧美日韩国产中文精品字幕自在自线| 日韩美女视频免费看| 欧美最近摘花xxxx摘花| www.欧美精品一二三区| 欧美日韩国产精品一区二区三区四区| 国产精品久久久久久久久久三级| 欧美午夜无遮挡| 日韩精品中文字幕久久臀| 亚洲国产精品久久久久| 欧美一级大片在线观看| 亚洲老头老太hd| 国产精品日日做人人爱| 久久视频精品在线| 亚洲欧美国产一本综合首页| 亚洲国产另类久久精品| 日韩专区中文字幕| 久久九九国产精品怡红院| 亚洲激情 国产| 91精品国产乱码久久久久久蜜臀| 精品国产精品三级精品av网址| 日韩高清电影免费观看完整版| 欧美性少妇18aaaa视频| 91精品国产九九九久久久亚洲| 中文字幕亚洲综合久久| 不用播放器成人网| 自拍偷拍亚洲区| 91中文精品字幕在线视频| x99av成人免费| 国产精品久久在线观看| 久久精品国产69国产精品亚洲| 日韩中文字幕亚洲| 中文字幕亚洲欧美日韩在线不卡| 亚洲999一在线观看www| 日韩av色在线| 精品美女永久免费视频| 久久韩国免费视频| 久久精品视频在线播放| 日韩成人在线视频| www欧美日韩| 在线观看久久久久久| 久青草国产97香蕉在线视频| 日韩资源在线观看| 91精品在线观看视频| 国产欧美日韩中文字幕在线| 亚洲日韩欧美视频一区| 欧美天堂在线观看| 久久久久久97| 社区色欧美激情 | 国产精品电影在线观看| 亚洲无限av看| 精品视频在线播放色网色视频| 日韩精品福利在线| 国产一区二区日韩精品欧美精品| 精品视频久久久久久| 精品久久久久久久久久| 亚洲精品wwww| 久久亚洲春色中文字幕| 欧美视频专区一二在线观看| 亚洲理论片在线观看| 欧美二区在线播放| 欧美黑人国产人伦爽爽爽| 欧美理论电影在线观看| 中文字幕国产亚洲| 国产美女精品免费电影| 久久精品国产一区| 久久91精品国产91久久跳| 91免费精品国偷自产在线| 狠狠躁夜夜躁人人爽天天天天97| 26uuu久久噜噜噜噜| 国内成人精品视频|