C++ COM編程之甚麼是接口?。本站提示廣大學習愛好者:(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.jb51.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經由過程兩個接口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表現由被挪用函數修正客棧。
接口是由純虛函數完成的,為何是要如許?和展示出來的多態,這個說來話長,我將鄙人一篇博文中停止總結。
總結
在這裡對接口基本常識停止了掃盲式的總結,而這些簡略的常識點也是往後開辟中會常常碰到的,這裡把這些器械控制好了,等往後開辟時也會覺得很輕松。願望年夜家能從這篇博文中學到必定的常識,同時也願望年夜家對我的博客提一些中肯的建議。