用C實現的一個基本COM介面IFoo(二)

來源:互聯網
上載者:User

在C實現COM介面系列1中實現的com介面IFoo與使用它的客戶耦合在一起,沒有實現在各自分離的模組,因此不符合模組化編程思想。本期添加類廠支援,以使介面的實現與介面的使用相分離。

---------------------------------------------------

類廠的作用到底是什嗎?

將介面的實現與客戶使用分離開來嗎?

不盡然。使用CoCreateInstance,客戶可以完全不必知道類廠的存在,而建立組件,擷取組件實現的介面並使用。

即COM庫可以完全拋開類廠的概念,而是提供一個這樣的函數原型:CoCreateObject(REFID rclsid,……,REFID riid,void **ppItf);使用者在調用的時候可以對riid提供IID_Unknown或者特定於該對象的一個介面,直接擷取該對象的IUnknown或特定的介面指標。

可以看到,這正是CoCreateInstance所作的事情。

1 類廠提供了間接建立類對象的方式:使用者可以先擷取並持有類廠介面指標,通過該指標所指向的類廠介面建立類對象。適用於需要建立多個(或重複建立)類對象的地方,減少了每次都要定位物件程式庫並把物件程式庫裝入記憶體的開銷。

2 類廠提供了保證組件庫留在記憶體不被卸載出去的另一種方法:類廠介面函數LockServer.組件庫維護一個庫範圍計數器,只有該計數器為0時,組件庫才允許自己被卸載出記憶體。(與此相對,引用計數是類物件範圍的,通過該類實現的各個介面來維護。如果一個類對象的引用計數達到0,那麼該對象佔有的記憶體就被釋放,該對象上的介面指標也不再有效。)

除了調用LockServer鎖定組件庫以外,當建立的組件個數大於0時,組件庫也不能被卸載。也可以說,調用一次LockServer()的作用相當於建立了一個組件。

-----------------------------------------------------------------------

客戶一側:1 使用一個介面需要知道哪些資訊?

備選:介面IID類對象(類廠)CLSID(或ProgID)

介面函數原型(參數個數,類型,傳回值)

實現介面組件的執行緒模式(進程內、進程外、遠程)?

類型庫typelib資訊?

服務一側:2 實現一個組件和介面以供客戶調用,需要提供哪些東西?

備選:所有客戶使用組件和介面所需的內容額外的還有:

--------------------------------------------------------------------

為dll添加。def檔案與直接在需要匯出的函數定義處指定_declspec( dllexport )有區別嗎?如果有是什麼區別?

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.