COM學習筆記4_創建COM組件的實現

爲了實現COM的動態鏈接,必須把組件的實現和客戶代碼分隔開。
一種處理是把組件放入DLL中。
這樣爲了支持客戶創建組建,組件需要導出一個類似CreateInstance的函數。

 

然後客戶需要載入Dll,再調用CreateInstance。如果所有COM都提供同樣的CreateInstance接口,這一處理可以變得比較通用:

 

傳入COM的DLL路徑名,就可以載入COM組件了。

 

 

在上面這個例子中有幾個問題。
1. 創建COM組件必須要知道對應的dll所在的位置,當dll位置發生移動會創建失敗
2. 如果一個dll中有多個COM組件,上面只能支持其中一個組件的創建

爲解決這一問題,實際中每個COM組件會有一個CLSID,這其實就是一個GUID,然後需要在註冊表中註冊。
註冊時會在註冊表中記錄COM組件的GUID和dll路徑。
這樣客戶只要知道COM組件的CLSID,然後在註冊表中就可以查詢到dll的路徑,這樣問題1解決了。
在dll導出的CreateInstance函數如果再接受一個CLSID作爲參數,通過CLSID創建不同的COM組件,則問題2也解決了

註冊信息放在註冊表的HKEY_CLASSES_ROOT的CLSID關鍵字下。
CLSID是一個類似{D01ECD7A-F5FE-4E39-85D9-878B14F487CB}的字串。
這個字串可十分不好記,所以還有一個對應的ProgID。
ProgID格式如下:<Program>.<Component>.<Version>
例如:Visio.Application.1
ProgID直接列在HKEY_CLASSES_ROOT下,每個ProgID對應一個CLSID。
一般客戶是知道COM組件的ProgID,通過ProgID查找到CLSID,最後通過找到的CLSID創建COM組件。
CLSIDFromProgID和ProgIDFromCLSID可實現ProgID與CLSID的相互轉換
注:COM組件的CLSID是全球唯一的,而ProgID可能重名

爲實現COM的註冊功能,DLL還需要導出兩個函數:
DllRegisterServer 和 DllUnregisterServer。
這樣可以通過Regsvr32.exe來註冊COM組件。Regsvr32實際上調用了dll中的DllRegisterServer函數

發佈了59 篇原創文章 · 獲贊 9 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章