ATL實戰開發指南 2 2

2021-06-21 23:27:07 字數 1297 閱讀 3593

下面**演示多介面的概念

class imath

class iadvancedmath

;

如果你要打算改變你的介面:在介面中新增 新的方法,或者改變介面中已有方法的引數。這樣是不應該的,因為客戶程式在編譯的時候已經同介面的虛表繫結了,比如上面的iadvancedmath。所以這裡建議你再新增乙個新的介面 :iadvancedmathex. 像下面這樣

class iadvancedmathex : public iadvancedmath

那麼上面我們描述了com的介面的原理,具體的實現的細節等一下再講,那麼對於使用元件的客戶端怎麼來訪問呢?

imath* pimath;

cocreateinstance(clsid_math, null, clsctx_inproc, iid_imath, &pimath);

這裡有很多細節問題,但是最重要的,com在這裡建立了乙個例項, 並返回了乙個指向vtable結構指標的指標。該table結構是由抽象類imath描述的。所以我們可以呼叫這個抽象類暴露出的方法。

大多數元件都有多個介面,系統將使用某種機制來實現,使客戶可以訪問某個特定的介面。

標準com介面的一些細節

1.所有元件必須實現iunknown介面,提供了一種標準途徑,使使用者可以在指定的元件訪問某個特定的介面---這就是上文提到的com的某種標準。元件物件的生存期管理

下面這是它的介面原型:

class iunknow

;

當客戶需要使用元件提供的服務的時候,可以通過介面查詢或者元件例項化的時候得到介面指標。

hresult stdmethodcalltype math::queryinte***ce( 

/* [in] */ refiid riid,

/* [annotation][iid_is][out] */

__rpc__deref_out void **ppvobject)

else if (iid_iadvancedmath == riid)

else if (iid_iunknown == riid)

else

static_cast(*ppvobject)->addref();

return s_ok;

}

在queryinte***ce的乙個實現中,我們可以看到它完整的實現了我們對該介面定位的功能。

ATL實戰開發指南 2 3

在上一節中,我看到了queryinte ce 的實現細節了,在裡面它並沒有建立例項,也就是說並沒有用c 的new來生成例項,它只是把this指標轉換成需要的介面指標。最後一行,用了乙個addref 函式。該函式是iunknown裡面的方法,他是用來管理元件例項的生命週期的。因為乙個元件可能在被建立出...

讀《ATL開發指南》p25感想

李國帥 於2005 12 9 8 50 作為一名c 開發人員,你將極其頻繁地實現和使用介面 作為c 類的實現者,乙個程式開發人員需要把類實現方面的細節封裝起來的。為了做到這一點,你可以使用public,private和protected。c 類的使用者僅通過類的公共介面與類例項打交道,因此介面被看作...

Django Web開發指南

國內第一本django圖書 django web開發指南 歡迎使用django 歡迎來到django的世界,很高興能和你一起進行這趟旅程。你會發現有了這個強大的web框架,做每件事情都變得便捷起來 從設計開發新應用到不用大刀闊斧地修改 就能為現有 提供新的特性和功能。關於本書 市面上已經有了一些講解...