程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++ COM編程之甚麼是接口?

C++ COM編程之甚麼是接口?

編輯:關於C++

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表現由被挪用函數修正客棧。

接口是由純虛函數完成的,為何是要如許?和展示出來的多態,這個說來話長,我將鄙人一篇博文中停止總結。

總結

在這裡對接口基本常識停止了掃盲式的總結,而這些簡略的常識點也是往後開辟中會常常碰到的,這裡把這些器械控制好了,等往後開辟時也會覺得很輕松。願望年夜家能從這篇博文中學到必定的常識,同時也願望年夜家對我的博客提一些中肯的建議。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved