用C實現的一個基本COM介面IFoo(一)

來源:互聯網
上載者:User

把該文中實現的代碼整理匯總到一個項目中。目前只是實現到一個中間階段,重點在說明COM介面的實現原理,還沒有包含類廠的部分。以後還需陸續添加類廠等進階功能。

檔案組成:

ifoo.h    COM介面IFoo,介面ID IID_IFoo 聲明檔案。

outside.c   COM介面實現。這裡實現IFoo的是一個結構體COutside.

util.h    一些宏定義、全域函數、變數聲明檔案。

main.c    筆者為實現項目添加的檔案。提供main函數、記憶體管理函數Alloc,Free的實現(封裝C運行庫函數malloc和free.)、介面ID定義。

COM介面到底是什嗎?

COM介面是一個指向虛函數表的指標。通過這個指標可以訪問記憶體中某處的各個功能塊,執行預定義的功能,完成使用者的任務。這些功能塊以函數的形式存在(想不出還有其他形式:))並被調用。它們有一個共同點:都包含一個指標參數,指向這些功能要操作的資料地址。在C++中,這個地址就是對象的首地址,也就是類成員函數中隱含的this指標。在C函數中並沒有這種現成的便利,因此代碼實現中在介面定義時仍使用了介面指標(HRESULT (__stdcall * QueryInterface)   (IFoo * This,  const IID * const, void **)),而在介面函數實現時根據結構體布局結構,從這個介面指標推算得到對象執行個體指標。

typedef struct IFoo
{
 struct IFooVtbl * lpVtbl;
} IFoo;
typedef struct IFooVtbl IFooVtbl;
struct IFooVtbl
{

 HRESULT (__stdcall * QueryInterface)   (IFoo * This,  const IID * const, void **) ;
 ULONG (__stdcall * AddRef)    (IFoo * This) ;
 ULONG (__stdcall * Release)   (IFoo * This) ;

 HRESULT (__stdcall * SetValue)         (IFoo * This,  int) ;
 HRESULT (__stdcall * GetValue)         (IFoo * This,  int *) ;
};

COM介面的要求:

每一個COM介面(指向的虛函數表)的頭三個函數必須是IUnknown介面的函數:QueryInterface,AddRef和Release.在C++中,稱為從IUnknown介面繼承。

對於調用QueryInterface響應查詢IID_IUnknwon得到的介面指標值,同一個對象實現的所有介面必須相同。這是判斷兩個COM對象是否是同一個對象的標準。

宏定義“#define IUNK_VTABLE_OF(x) ((IUnknownVtbl *)((x)->lpVtbl))”說明

相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

11.11 Big Sale for Cloud

Get Unbeatable Offers with up to 90% Off,Oct.24-Nov.13 (UTC+8)

Get It Now >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。