COM,即元件物件模型,是關於如何建立組件以及如何通過組件建立應用程式的一個規範,說明了如何可動態交替更新群組件。
1、使用組件的優點:
組件架構的一個優點就是應用可以隨時間的流逝而發展進化。除此之外,使用組件還有一些可以使對已有應用升級更加方便和靈活的優點,如應用的定製,組件庫以及分布式組件等
使用組件的種種優點直接來源於可以將它們動態插入或卸出應用。為了實現這種功能,所有的組件必須滿足兩個條件:
第一,組件必須動態連結;
第二,它們必須隱藏(或封裝)其內部實現細節。動態連結對於組件而言是一個至關重要的要求,而訊息隱藏則是動態連結的一個必要條件。
COM組件由以Win 32動態串連庫(DLL)或可執行檔(EXE)形式發布的可執行代碼所組成。遵循COM規範編寫出來的組件將能夠滿足對組件架構的所有要求。COM組件可以給應用程式、作業系統以及其他組件提供服務;自訂的COM組件可以在運行時刻同其他元件連線起來構成某個應用程式;COM組件可以動態插入或卸出應用。
2、如何註冊com組件?
有兩種方式註冊組件:
一種是調用regsvr32.exe:
例如我們運行regsvr32.exe c:\test.dll來註冊位於C:盤根目錄下的test.dll。
另外一種是在MTS(微軟事務伺服器)中註冊。MTS是值得推薦的,因為它具有下列優點:
1)、動態卸載平衡,提高組件和基於組件的應用程式的升級性。
2)、包含公布和提交事件和隊列組件的能力,使得更容易與多個組件聯合。
3、com組件與註冊表的關係?
COM的重要性質之一是位置透明性。相對而言,以往在調用普通動態連結程式庫中的輸出函數時,必須要將此動態連結程式庫放到應用程式的同級目錄下(或系統可以找得到的目錄下,如Windows目錄、環境中已有的搜尋路徑等),或將動態庫的位置資訊寫入程式碼到程式中的做法,其實都說明了普通動態庫的位置不透明性。
當客戶程式調用COM對象時,會更輕鬆一些,因為調用方不需要考慮COM組件所處的位置,不論它在哪個目錄下,或是否在當前工作站上,一切都由系統提供的機制來保障對COM對象的定位,這就是位置無關性。
其實,COM位置無關性的實現機制並不深奧,它主要依賴於註冊表,這也就是為什麼一定要在使用之前對COM組件進行註冊的原因。COM庫在接到客戶程式的請求後,會到註冊表中檢索COM對象的註冊條目,並以此來定位COM對象。
對於COM對象,如要使之能夠成功地被COM庫定位,則需要至少在註冊表中寫入1和2所示的資訊。
觀察這兩個註冊資訊,可以發現它們之間是有聯絡的。現在在註冊表的HKEY_ CLASSES_ROOT\鍵中增加了一個註冊項{18034D20-B0C3-4135-9DCF-C2E12A58D330},這個GUID正是CLSID,代表COM類。
圖1 組件的ProgID註冊
圖2 組件的CLSID資訊註冊
在這個註冊項目下,有一個名為InProcServer32的字串值,它代表容納此COM 類的載體應當是一個動態連結程式庫。這個字串值的資料是“xxx.dll”,指明了組件所處的物理位置,這個資訊對COM庫尋找和定位組件起到了決定性的作用。
下面還有一個名為ProgID的字串值,其內容是MyCOM.SimpleMath.1。ProgID的出現主要是為了給長長的CLSID起一個“人性化”的名稱,通常在客戶程式中使用ProgID代替CLSID。
另外,也可以使用ProgID在註冊表中對COM對象進行標識,在圖2中顯示的資訊就是組件ProgID的註冊資訊,其中一個名為CLSID字串值的資料就是COM對象的CLSID值,所以,無論根據ProgID或CLSID,都可以定位到指定組件。
當然,COM組件不能天生就具備將註冊資訊寫入到註冊表中的功能,對同處理序伺服程式而言,還必須實現兩個名為DllRegisterServer和DllUnregisterServer的輸出函數,來負責註冊資訊的寫入和卸載。
HRESULT DllRegisterServer(void)
{
// 主要實現方法:
// 調用Windows API函數得到模組當前所在的物理位置,
// 調用Windows API操作註冊表的函數建立圖5-4、5-5中所示的註冊項目
…(代碼略)
}
HRESULT DllUnregisterServer(void)
{
// 主要實現方法
// 調用Windows API操作註冊表的函數,在註冊表中刪除寫入的資訊。
(代碼略)
}