第二章 接 口
什麼是接口 DLL的接口可以了解為其導出的那些函數,C++類的接口則是該類的一個成員函數集。 對于COM來說,接口是一個包含一個函數指針數組的記憶體結構,每一個數組元素包含的是一個由元件所實作的函數的位址。對COM而言,接口就是這樣的一個記憶體結構,無關細節與具體語言實作。(即不管是C#還是C++實作,隻要給我這麼個記憶體結構,我就認為你是一個接口) 接口的作用 接口對COM來說很總要!隻需記住下面三點: (1)COM中接口就是一切。 (2)對客戶而言,一個元件就是一個接口集合(客戶通過QueryInterface擷取想要的接口)。 (3)客戶隻能通過接口與COM元件打交道。 COM接口在C++中的代碼實作 參加COM中接口的定義,在C++中,可以通過抽象基類來實作COM接口。 抽象基類,其實是定義了一個記憶體結構,抽象基類僅包含虛函數,是以其包含虛表與虛指針。如下圖所示,抽象基類如
interface IX
{
virtual void STDMETHODTYPE Fx1()=0;
virtual void STDMETHODTYPE Fx2()=0;
virtual void STDMETHODTYPE Fx3()=0;
}
其在記憶體中僅包含一個虛指針,而這個虛指針則指向一組虛函數的實作清單(函數指針數組)。這剛好符合COM對接口的定義。 是以COM接口在C++中的實作是通過抽象基類實作的。子類繼承抽象父類,并實作或重寫抽象函數。子類同時也就繼承了這種記憶體結構,即 子類獲得了向客戶提供這種接口的提供能力,同時對于元件對于多個接口的支援,可以通過讓子類多重繼承抽象父類來實作。
一些細節 1、标準調用約定 在Microsoft平台上,COM接口提供的是以函數均遵循PASCAL調用約定,即函數将在傳回到調用者之前進行參數的出棧處理。是以接口中的函數均有修飾符__standcall 或STDMETHODCALL 2、C++中接口雖然是抽象基類實作,但可以不用class來聲明類,而是用OBJBASE.H中定義的宏
#define interface struct
這樣預設公有屬性。