COM技術縱橫之談二(初學者) 阿新 • • 發佈:2019-02-08 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的時間也不長,歡迎大家一起來討論! 明天打算討論類廠,歡迎感興趣的朋友繼續關注! (全文完)