客戶端調用CoCreateInstance,導致調用CoGetClassObject,CoGetClassObject通過查找注冊表,得知 DLL位置,文件名,然后調用DLL中DllGetClassObject,DllGetClassObject的功能是返回CFactory的實例.返 回后,回到CoCreateInstance,通過CFactory的指針,調用pClassFactory->CreaetInstance() 創建組件實例 。
上面告訴你客戶端獲取COM組件一些實現接口對象的2個API函數具體內部實現流程。 從這里我們就可推測出有個工廠類用來創建接口實現類對象。整個框架就可以出來了:
COM組件中又一系列自定以的接口繼承了IUnKown 接口,這個接口里有3個方法 QueryInterface()查詢并返回接口的實現類的指針 AddRef ()自增加計數 Release()自減計數 。 所有接口類的實現類都必須實現這個3個方法。
一個COM組件會有多個類工產,所有使用DllGetClassObject()來產生相應的類工廠,類工廠古名思議就是用來生產接口實現類的類,當然類 工廠也繼承了IFactroy的接口CreateInstance()創建接口對象 LockServer()同時IFactroy也繼承了IUnKown 接口所有還有前3個接口 QueryInterface()AddRef ()Release()共有6個接口。
COM組件是需要注冊的,因為它需要把16*8位的全局唯一標示符、一個字符串命名、路徑一起保存到注冊表里,程序可以通過一個一個字符串命名到注冊表中找到相應的128位標示符與路徑,來加載DLL。
所有這里就必須需要寫個(函數名不能更改)
DllRegisterServer ()注冊com組件 里面的代碼就是上面寫的吧相應的信息用注冊WINAPI吧相應的信息注冊到注冊表中 resgvr32那個注冊器的實現代碼我也可以簡單說下,其實那個只不過是傳個DLL路徑和DLL命名,然后調用加載dll的 LoadLibrary() 然后再嗲用GetProcAddress("","DllRegisterServer "),按此你可以自己寫個resgvr32。
DllUnregisterServer()卸載 里面寫的卸載剛才注冊的信息
DllCanUnloadNow() 這個是判斷是否可以卸載這個COM組件的引用,估計是定時去檢測的。里面的代碼就是2個計數變量的判斷是否不再使用即=0;
所有綜上所述,COM組件只需輸出4個函數
DllGetClassObject @1 PRIVATE
DllRegisterServer @2 PRIVATE
DllUnregisterServer @3 PRIVATE
DllCanUnloadNow @4 PRIVATE
呵呵,至此我吧自己研究的全部貼了出來。這只是簡單的COM組件的框架。呵呵,還有其他的我沒有時間深入研究了,奉獻出來給大家一起探討。
歡迎光臨 (http://m.zg4o1577.cn/bbs/) | Powered by Discuz! X3.1 |