下面**演示多介面的概念
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框架,做每件事情都變得便捷起來 從設計開發新應用到不用大刀闊斧地修改 就能為現有 提供新的特性和功能。關於本書 市面上已經有了一些講解...