C++ COM編程之什么是接口?
什么是接口?
說到COM,就不得不說接口了;在進(jìn)行COM開發(fā)的過程中,可以說,我一直都在和各種各樣的接口打交道。那接口是什么?對(duì)于COM來說,接口是一個(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++中,可以使用抽象基類來實(shí)現(xiàn)COM接口。由于一個(gè)COM組件可以支持任意數(shù)目的接口,因此對(duì)于組件,可以使用抽象基類的多重繼承來實(shí)現(xiàn)它。
接口的好處
接口提供了兩個(gè)不同對(duì)象間的一種連接。對(duì)于客戶來說,一個(gè)組件就是一個(gè)接口集。客戶只能通過接口才能同COM組件打交道。而整體上來講,客戶對(duì)于一個(gè)組件可以說是知之甚少;甚至在某些時(shí)候,客戶甚至不必知道一個(gè)組件所提供的所有接口,就像你進(jìn)行Windows Shell開發(fā)時(shí),對(duì)于一個(gè)它提供的組件,很多時(shí)候,你不可能知道所有的接口的。對(duì)于一個(gè)應(yīng)用程序而言,接口是最重要的。組件本身只不過是接口的實(shí)現(xiàn)細(xì)節(jié)。
在實(shí)際開發(fā)時(shí),你并不需要去理會(huì)組件的實(shí)現(xiàn)細(xì)節(jié),你面對(duì)的是接口,面對(duì)接口工作。即使組件的開發(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)
通過一個(gè)簡(jiǎn)單的例子來理解接口:
/*
** FileName : SimpleInterfaceDemo
** Author : Jelly Young
** Date : 2013/12/11
** Description : More information, please go to //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通過兩個(gè)接口pIExample1和pIExample2來和組件進(jìn)行通信。在聲明接口時(shí),使用了兩個(gè)純抽象基類IX和IY。總結(jié)上面代碼的關(guān)鍵之處在于:
1.COM接口在C++中是用純抽象基類實(shí)現(xiàn)的;
2.一個(gè)COM組件可以提供多個(gè)接口;
3.一個(gè)C++類可以使用多繼承來實(shí)現(xiàn)一個(gè)可以提供多個(gè)接口的組件。
細(xì)節(jié)剖析
interface這貨是從哪里來的?你會(huì)很好奇,是不是好奇的連下巴都掉下來了?C++也有interface關(guān)鍵字?不錯(cuò),這個(gè)關(guān)鍵字是在combaseapi.h頭文件中定義的,定義如下:
#define __STRUCT__ struct
#define interface __STRUCT__
說白了,就是用C++的關(guān)鍵字struct定義的一個(gè)結(jié)構(gòu)體。使用struct定義有什么好處呢?首先需要搞清楚struct和class的區(qū)別。學(xué)了Java和C#的都知道,由于接口中定義的都是允許客戶調(diào)用的,所以在接口中就不需要private和protected的了,如果使用class,而必須還要使用public關(guān)鍵字強(qiáng)調(diào)接口的公有屬性,而struct默認(rèn)的都是公有屬性,這樣就省去了添加public關(guān)鍵字的麻煩。
__stdcall是什么?__stdcall是一種用來修飾函數(shù)的關(guān)鍵字,主要約定了兩件事情:
1.參數(shù)傳遞順序,__stdcall表示參數(shù)從右向左壓入堆棧;
2.調(diào)用堆棧由誰(調(diào)用函數(shù)或被調(diào)用函數(shù))清理,__stdcall表示由被調(diào)用函數(shù)修改堆棧。
接口是由純虛函數(shù)實(shí)現(xiàn)的,為什么是要這樣?以及展現(xiàn)出來的多態(tài),這個(gè)說來話長(zhǎng),我將在下一篇博文中進(jìn)行總結(jié)。
總結(jié)
在這里對(duì)接口基礎(chǔ)知識(shí)進(jìn)行了掃盲式的總結(jié),而這些簡(jiǎn)單的知識(shí)點(diǎn)也是日后開發(fā)中會(huì)經(jīng)常遇到的,這里把這些東西掌握好了,等日后開發(fā)時(shí)也會(huì)感到很輕松。希望大家能從這篇博文中學(xué)到一定的知識(shí),同時(shí)也希望大家對(duì)我的博客提一些中肯的建議。
上一篇:C語言求冪計(jì)算的高效解法
欄 目:C語言
本文標(biāo)題:C++ COM編程之什么是接口?
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/3329.html
您可能感興趣的文章
- 04-02c語言沒有round函數(shù) round c語言
 - 01-10深入理解C++中常見的關(guān)鍵字含義
 - 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
 - 01-10c++中inline的用法分析
 - 01-10用C++實(shí)現(xiàn)DBSCAN聚類算法
 - 01-10全排列算法的非遞歸實(shí)現(xiàn)與遞歸實(shí)現(xiàn)的方法(C++)
 - 01-10C++大數(shù)模板(推薦)
 - 01-10淺談C/C++中的static與extern關(guān)鍵字的使用詳解
 - 01-10深入C/C++浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)方式詳解
 - 01-10深入理解C/C++混合編程
 


閱讀排行
- 1C語言 while語句的用法詳解
 - 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
 - 3利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
 - 4C語言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
 - 5c語言計(jì)算三角形面積代碼
 - 6什么是 WSH(腳本宿主)的詳細(xì)解釋
 - 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
 - 8正則表達(dá)式匹配各種特殊字符
 - 9C語言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
 - 10C語言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
 
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
 - 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
 - 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
 - 04-02c語言用函數(shù)寫分段 用c語言表示分段
 - 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)
 - 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
 - 04-02c語言沒有round函數(shù) round c語言
 - 04-02c語言分段函數(shù)怎么求 用c語言求分段
 - 04-02C語言中怎么打出三角函數(shù) c語言中怎
 - 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
 
隨機(jī)閱讀
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
 - 01-11ajax實(shí)現(xiàn)頁面的局部加載
 - 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
 - 01-10delphi制作wav文件的方法
 - 04-02jquery與jsp,用jquery
 - 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
 - 01-10C#中split用法實(shí)例總結(jié)
 - 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
 - 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
 - 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
 


