C++ COM編程-什么是接口


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

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

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

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

3. 接口簡單實現

 1 #include <iostream>
 2 #include <combaseapi.h>
 3 using namespace std;  4 interface IExample1//接口1
 5 {  6      virtual void __stdcall Fx1() = 0;  7      virtual void __stdcall Fx2() = 0;  8 };  9 interface IExample2//接口2
10 { 11      virtual void __stdcall Fy1() = 0; 12      virtual void __stdcall Fy2() = 0; 13 }; 14 // Implementation接口具體的實現
15 class CImplementation : public IExample1, public IExample2 16 { 17 public: 18      // Implementation IExample1
19      void __stdcall Fx1() { cout<<"CImplementation::Fx1"<<endl; } 20      void __stdcall Fx2() { cout<<"CImplementation::Fx2"<<endl; } 21      // Implementation IExample2
22      void __stdcall Fy1() { cout<<"CImplementation::Fy1"<<endl; } 23      void __stdcall Fy2() { cout<<"CImplementation::Fy2"<<endl; } 24 }; 25 // Client客戶使用接口
26 int main() 27 { 28      cout<<"Create an instance of the component."<<endl; 29      CImplementation *pCImplementation = new CImplementation; 30      // Get the IExample1 pointer
31      IExample1 *pIExample1 = pCImplementation; 32      // Use the IExample1 interface
33      pIExample1->Fx1(); 34      pIExample1->Fx2(); 35      // Get the IExample2 pointer
36      IExample2 *pIExample2 = pCImplementation; 37      // Use the IExample2 pointer 38      // Use the IExample2 interface
39      pIExample2->Fy1(); 40      pIExample2->Fy2(); 41      // Destroy the component
42      if (pCImplementation != NULL) 43  { 44           delete pCImplementation; 45           pCImplementation = NULL; 46           pIExample1 = NULL; 47           pIExample2 = NULL; 48  } 49 }

上面的例子中,client通過兩個接口pIExample1和pIExample2來和組件進行通信。在聲明接口時,使用了兩個純抽象基類IX和IY。總結上面代碼的關鍵之處在於:

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

細節剖析

interface這貨是從哪里來的?C++也有interface關鍵字?不錯,這個關鍵字是在combaseapi.h頭文件中定義的,定義如下:

1 #define __STRUCT__ struct
2 #define interface __STRUCT__

說白了,就是用C++的關鍵字struct定義的一個結構體。使用struct定義有什么好處呢?由於接口中定義的都是允許客戶調用的,所以在接口中就不需要private和protected的了,如果使用class,而必須還要使用public關鍵字強調接口的公有屬性,而struct默認的都是公有屬性,這樣就省去了添加public關鍵字的麻煩。
__stdcall是什么?__stdcall是一種用來修飾函數的關鍵字,主要約定了兩件事情:
① 參數傳遞順序,__stdcall表示參數從右向左壓入堆棧;
② 調用堆棧由誰(調用函數或被調用函數)清理,__stdcall表示由被調用函數修改堆棧。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM