在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 )有區別嗎?如果有是什麼區別?