COM(组件对象模型)
COM :創(chuàng)建和使用組件的標(biāo)準(zhǔn)
(DLL:COM的一種實現(xiàn))
任何程序都由若干組件構(gòu)成
??????
組件:實現(xiàn)接口的功能模塊
???????
組件特點:(1)動態(tài)鏈接 (2)隱藏(內(nèi)部)實現(xiàn)(實現(xiàn)語言,實現(xiàn)邏輯)
??????
COM最終目的:動態(tài)替換組件
????
COM庫(COM Library):支持組件管理
?????
外部程序/組件 只通過接口訪問組件
????
外部程序/組件只能通過查詢接口(QueryInterface)了解組件支持的接口
?????
查詢接口(QueryInterface)規(guī)則:
(1)(同一組件)總是返回同一IUnknow 指針
(2)外部可獲得曾獲得的接口
(3)外部可再次獲得已獲得接口
(4)外部可返回起始接口
(5)可從任意接口獲得已獲得接口
????? ????????
接口引用計數(shù)規(guī)則:
(1)返回(接口指針)之前AddRef:返回接口指針的函數(shù)內(nèi)部
(2)(接口指針)賦值之后AddRef
(3)使用完(接口)之后Release
????
組件使用過程?
(1)創(chuàng)建組件對象(CreateInstance):返回IUnknow指針
(2)通過IUnknow指針查詢組件中接口(QueryInterface):根據(jù)接口ID(IID)返回接口指針
???????
--------------------------------------------------------------------------------------------------------
COM的實現(xiàn) : DLL
???
win32使用(只含純虛函數(shù)的)結(jié)構(gòu)體(struct)表示接口(interface)
#define interface struct
????
(通過)接口指針 調(diào)用接口函數(shù):多態(tài)調(diào)用 實現(xiàn)函數(shù)(實現(xiàn)對象+虛表 / 靜態(tài)實現(xiàn)函數(shù))
???? ?
多態(tài):按同一種方式處理不同的對象
????
接口定義了一種內(nèi)存結(jié)構(gòu),實現(xiàn)類繼承這個結(jié)構(gòu)
接口定義了實現(xiàn)類的虛表結(jié)構(gòu)
?????
接口繼承接口, 類實現(xiàn)接口
?????
所有接口 繼承 IUnknow接口(查詢接口+控制生命周期)
??? interface IUnknow {
??????? virtual HRESULT __stdcall QueryInterface(const IID& iid, void** ppInterface) = 0;//查詢組件接口
??????? virtual ULONG __stdcall AddRef() = 0;
??????? virtual ULONG __stdcall Release() = 0;
??? }
一個組件只有一個IUnknow接口
???????
通過類工廠創(chuàng)建組件對象,查詢接口
CoCreateInstance (const CLSID& clsid, IUnknown*, DWORD, const IID& iid, void** ppInterface)
(1)CoGetClassObject (const CLSID& clsid, DWORD, COSERVERINFO*, IID_IClassFactory , void** ppInterface)
?? 創(chuàng)建類工廠對象 ???? 獲取類工廠接口(IClassFactory)
(2)pIClassFactory->CreateInstance (IUnknown*, const IID&, void** ppInterface);
??? 創(chuàng)建組件對象,查詢接口
???????
DLL:進(jìn)程內(nèi)組件
EXE:進(jìn)程外組件?
?????
????? ?
總結(jié)
以上是生活随笔為你收集整理的COM(组件对象模型)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ABI(Application Bina
- 下一篇: TSD(Thread Specific