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

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

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

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

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

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

             COM組件是需要注冊(cè)的,因?yàn)樗枰?6*8位的全局唯一標(biāo)示符、一個(gè)字符串命名、路徑一起保存到注冊(cè)表里,程序可以通過(guò)一個(gè)一個(gè)字符串命名到注冊(cè)表中找到相應(yīng)的128位標(biāo)示符與路徑,來(lái)加載DLL。

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

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

DllUnregisterServer()卸載 里面寫(xiě)的卸載剛才注冊(cè)的信息

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

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

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

    呵呵,至此我吧自己研究的全部貼了出來(lái)。這只是簡(jiǎn)單的COM組件的框架。呵呵,還有其他的我沒(méi)有時(shí)間深入研究了,奉獻(xiàn)出來(lái)給大家一起探討。






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