ATL實戰開發指南 2 3

2021-06-21 23:56:44 字數 1475 閱讀 2943

在上一節中,我看到了queryinte***ce 的實現細節了, 在裡面它並沒有建立例項,也就是說並沒有用c++的new來生成例項,它只是把this指標轉換成需要的介面指標。最後一行,

用了乙個addref()函式。該函式是iunknown裡面的方法,他是用來管理元件例項的生命週期的。因為乙個元件可能在被建立出來的時候起,就被工程中多處使用,我們不知道何時來釋放,所以com標準介面中提供了對生命週期的管理的兩種方法,addref() 和release();

下面是用c++來實現這兩個方法的:

math(): m_nref(0) {}

ulong math::addref()

ulong math::release()

return m_nref;

}

上面兩個interlock系列函式是為了支援多執行緒的。

在建立元件之前,我們先介紹乙個概念: 全域性特有識別符號guid, 他是獨有的,128位的,具有非常高的可靠率的精確值,也叫uuid,com使用它來識別元件類(clsid),

介面類(iid), 型別庫和元件類屬(catid)以及其它的一些東西。如

define_guid(iid_imath,

0x1827709d, 0x9879, 0x4c60, 0x8b, 0x79, 0x85, 0xcd, 0x42, 0x55, 0xb9, 0xac);在vs2008上,它可以由tool --create guid獲得。

當然你在使用iid_imath的時候,還得包含標頭檔案initguid.h

//  常用來對guid操作的函式

isequalguid(refguid rguid1, refguid rguid2);  // 比較兩個guid是否相等

isequaliid(refiid riid1, refiid riid2);       // 比較兩個iid是否相等

isequalclsid(refclsid , refclsid);            // 比較兩個clsid是否相等

progidfromclsid(__in refclsid clsid, __deref_out lpolestr far* lplpszprogid);

com設計者考慮到要記住clsid並不容易,所以它通過另外一種機制來對元件命名:programmatic identifier(progid)它是乙個簡單的字串。它通過登錄檔與元件相連。

只要你記得這個元件的名字,就可以通過clsidfromprogid函式來獲得元件的clsid.

com以及給客戶用來定位元件的資訊和對元件例項化的資訊被儲存在登錄檔中,那麼上面提到的內容被存放在hkey_class_root的子鍵clsid下面。

inprocserver32包含了dll檔案的路徑和名稱

versionindepentprogid制定了元件當前最新的版本

localserver32包含了exe檔案的路徑和名稱

curver   元件類最新版本的progid

ATL實戰開發指南 2 2

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

讀《ATL開發指南》p25感想

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

Django Web開發指南

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