com元件、物件、介面
1、com(component object model)元件物件模型。
特點:語言無關、可以重用
應用:DirectX、OLE DB、ADO
OLE是com的應用。
2、
一個com元件包括多個com物件,一個com物件實現多個介面。
3、com物件類似於c++中的類,包含屬性和方法。在c++中,可以用類來定義com物件。
com元件對客戶來說是透明的。
GUID用於標識com元件。
com介面:二進位制特性,每個介面必須從IUnknown繼承而來。
4、 IUnknown的定義:
interface IUnknown
{
HRESULT QueryInterface(
[in] REFIID iid,
[out] void **ppv);
ULONG AddRef();
ULONG Release();
}
輸入引數iid為介面識別符號:IID。
輸出引數ppv為查詢得到的結果介面指標。
IUnknown包含三個函式,分別是 QueryInterface、AddRef、Release。這三個函式是無比重要的,而且它們的排列順序也是不可改變的。
QueryInetrface:查詢com物件的其他介面指標
AddRef和Release用於對引用計數進行操作。
引用計數:每個com物件都記錄 一個“引用計數“的數值,該數值記錄了有多少個指標在使用com物件。使用者得到指向該物件的介面的指標後,引用計數加一,用完後引用計數減一。減到0時,com物件就在記憶體中清除。
AddRef、Release分別用於引用計數加一減一操作。
HRESULT QueryInterface(
[in] REFIID iid,
[out] void **ppv);
返回32位的整數,有三種情況:
(1)S_OK,查詢到了指定介面,介面指標存放在ppv輸出的引數中。
(2)E_NOINTERFACE,物件不支援指定介面,*ppv為NULL。
(3)E_UNEXPECTED,發生錯誤。
HRESULT型別是一個32位的整數。反映函式呼叫結果。
5、com物件和介面表示方法:
6、DLL動態庫或exe程式可以看做是com在windows上的具體實現。
dll:包括函式引出表,有函式的名稱、編號、地址。
dll匯出函式的方式:
(1) 原始碼中的 __declspec(dllexport)
(2).def 檔案中的 EXPORTS 語句
dll的引出函式格式:
extern “c” long _stdcall MyFunction();
extern “c” int _stdcall MyFunction();
dll中的def檔案用於描述dll程式的模組資訊。
如 mylib.def:
; mylib.def : 宣告 DLL 的模組引數。
LIBRARY
EXPORTS
; 此處可以是顯式匯出
DllCanUnloadNow PRIVATE
DllGetClassObject PRIVATE
DllRegisterServer PRIVATE
DllUnregisterServer PRIVATE
com元件必須在系統登錄檔中註冊後,才能被客戶端呼叫。
客戶端不直接呼叫引出函式,通過com庫的API呼叫。
呼叫dll可按照如下步驟:
com客戶端程式使用LoadLibrary函式裝入dll,然後客戶端呼叫GetProcAddress函式獲得dll中引出函式的地址。當函式使用完後,如果不在使用dll程式,則呼叫FreeLibrary把dll程式卸出記憶體。
7、類廠:
com庫通過類廠建立com物件。一個物件對應一個類廠。類廠是一個物件,有IClassFactory介面。
com庫包含了com元件。使用com庫時,先初始化。
com庫常用函式:
初始化:
CoBuildVersion //獲取com庫版本
Coinitialize //com庫初始化
CoUninitialize //com庫功能服務終止
class IClassFactory:public IUnknwn
{
virtual HRESULT _stdcall CreateInstance(IUnknown *pUnknownOuter,const IID&iid,void **ppv)=0;//建立com物件
virtual HRESULT _stdcall LockServer(BOOL block)=0;
};
類廠由引出函式DllGetClassObject建立。
HRESULT DllGetClassObject(const CLSID& clsid,const IID& iid,(void*)ppv);
8、com開發:com sdk、MFC、ATL