標題: com組件的繼續(xù)淺談 [打印本頁]

作者: liuyang    時間: 2012-1-11 20:30
標題: com組件的繼續(xù)淺談
   com組件關于以DLL形式的編寫 有以下幾塊。 

                   客戶端調(diào)用CoCreateInstance,導致調(diào)用CoGetClassObject,CoGetClassObject通過查找注冊表,得知 DLL位置,文件名,然后調(diào)用DLL中DllGetClassObject,DllGetClassObject的功能是返回CFactory的實例.返 回后,回到CoCreateInstance,通過CFactory的指針,調(diào)用pClassFactory->CreaetInstance() 創(chuàng)建組件實例 。   

          上面告訴你客戶端獲取COM組件一些實現(xiàn)接口對象的2個API函數(shù)具體內(nèi)部實現(xiàn)流程。 從這里我們就可推測出有個工廠類用來創(chuàng)建接口實現(xiàn)類對象。整個框架就可以出來了:

                 COM組件中又一系列自定以的接口繼承了IUnKown 接口,這個接口里有3個方法  QueryInterface()查詢并返回接口的實現(xiàn)類的指針  AddRef ()自增加計數(shù)  Release()自減計數(shù) 。  所有接口類的實現(xiàn)類都必須實現(xiàn)這個3個方法。                           

              一個COM組件會有多個類工產(chǎn),所有使用DllGetClassObject()來產(chǎn)生相應的類工廠,類工廠古名思議就是用來生產(chǎn)接口實現(xiàn)類的類,當然類 工廠也繼承了IFactroy的接口CreateInstance()創(chuàng)建接口對象  LockServer()同時IFactroy也繼承了IUnKown 接口所有還有前3個接口 QueryInterface()AddRef ()Release()共有6個接口。   

             COM組件是需要注冊的,因為它需要把16*8位的全局唯一標示符、一個字符串命名、路徑一起保存到注冊表里,程序可以通過一個一個字符串命名到注冊表中找到相應的128位標示符與路徑,來加載DLL。

所有這里就必須需要寫個(函數(shù)名不能更改)

DllRegisterServer ()注冊com組件 里面的代碼就是上面寫的吧相應的信息用注冊WINAPI吧相應的信息注冊到注冊表中 resgvr32那個注冊器的實現(xiàn)代碼我也可以簡單說下,其實那個只不過是傳個DLL路徑和DLL命名,然后調(diào)用加載dll的 LoadLibrary()  然后再嗲用GetProcAddress("","DllRegisterServer "),按此你可以自己寫個resgvr32。

DllUnregisterServer()卸載 里面寫的卸載剛才注冊的信息

 DllCanUnloadNow() 這個是判斷是否可以卸載這個COM組件的引用,估計是定時去檢測的。里面的代碼就是2個計數(shù)變量的判斷是否不再使用即=0;

    所有綜上所述,COM組件只需輸出4個函數(shù) 

DllGetClassObject @1 PRIVATE
 DllRegisterServer @2 PRIVATE
 DllUnregisterServer @3 PRIVATE
 DllCanUnloadNow   @4 PRIVATE

    呵呵,至此我吧自己研究的全部貼了出來。這只是簡單的COM組件的框架。呵呵,還有其他的我沒有時間深入研究了,奉獻出來給大家一起探討。






歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1