1. 程式人生 > >COM技術縱橫之談二(初學者)

COM技術縱橫之談二(初學者)

COM縱橫談之二



元件中分配了一塊記憶體,然後建起通過一個引數(可能是一個返回的指
針)傳遞給了客戶,這是一種非常常見的做法。問題是:誰來釋放這塊
記憶體?這主要是由於組建和客戶可能是有不同的程式設計師實現的,他們之
間沒有辦法建立一種分配和釋放記憶體的標準辦法。COM解決中各問題的辦
法是提供一個介面(IMalloc),它可以有CoGetMalloc返回。為了分配
記憶體,只需要呼叫IMalloc::Alloc,而呼叫改函式所分配的記憶體可以有
IMalloc::Free負責釋放。為了更加簡單的實現,COM庫提供了兩個更加
簡單的函式:
void
CoTaskMemAlloc(ULONG cb
/* size in bytes of block to be allocated */);

void CoTaskMemFree(void* pv);
如果你認真看了我的文章,到現在為止你大體上已經有了一個概念:
COM究竟是一種什麼概念,它在哪些程度上需要程式設計師來實現,哪些則是
由作業系統所提供的COM庫完成的。不十分嚴格的說,COM的目的是把各
種各樣的函式分類,然後封裝成一個個物件,這些物件在windows系統中
以DLL或者EXE的形式具體存在,並且通過登錄檔,window隨時隨地可以
知道某個特定元件的程式碼是在那個對應得DLL或者EXE裡。這裡提一下,
怎麼告訴windows你需要哪個元件呢?我們使用GUID,其複雜的演算法保證
了世界上沒有兩個個介面的ID標示號碼是完全一樣的!從而可以唯一的
確定元件,包括內含的介面,在客戶需要該元件的時候windows也就可以
正確的裝載它了。同樣也是因為這個唯一性,客戶在任何時候都可以直
截了當的,明確無誤的詢問windows,我要的就是這個元件裡的這個接
口!告訴我你有嗎?這時候,通過一個CoCreateInstance函式,windows
將返回介面指標,或者乾脆的告訴你,沒有找到!
那麼,windows內部在執行這個函式的時候具體做了些什麼呢?首先它
查詢了登錄檔,找尋你所要的元件(元件也就是介面集,而所謂介面也
就是一組函式所組成的集合的代名詞,這麼說你明白了嗎?)如果沒有
找到該元件,查詢自然失敗,函式返回,如果找到了,那麼進一步的,
核心將向windows返回該元件的IUnknown*指標,windows隨後利用
IUnknown::QueryInterface函式查詢你所指定的那個介面是不是被該元件
所實現(或者說支援)說到這裡你一定可以發現,凡是介面,一般來說總
是要由你的程式碼去實現,IUnknown這個所有COM元件都必須實現的介面,
其目的之一就是讓Windows知道如何查詢你的元件。直到元件裡實現了哪
些介面的只有你自己--寫這個元件的人,所以你有責任妥當的好好些
QueryInterface函式以便返回正確的指標,windows隨後將該指標轉給
CoCreateInstance的呼叫處,整件事情也就結束了。現在你瞭解了嗎?
寫到這裡,不知不覺的已經過了一個星期,不知道有沒有朋友看了拙
文之後有質疑?我學習COM的時間也不長,歡迎大家一起來討論!
明天打算討論類廠,歡迎感興趣的朋友繼續關注!
(全文完)