[转]COM对象创建-外部机制
?
所謂“外部機制”,指的是應用程序創建ATL COM對象類廠的過程。應用程序并不關心COM對象是MFC實現方式的還是ATL實現方式的,它永遠使用CoCreateInstance這類API函數,通過類廠創建COM對象。在ATL下,應用程序對CoCreateInstance的調用,是如何轉換到對ATL COM對象類廠CreateInstance方法的調用的呢?
?
COM服務器
?
COM對象不能憑空存在,它必須存在于操作系統的某種可執行文件中。由于只有Windows操作系統支持COM規范,很自然地,COM對象存在于Windows操作系統的可執行文件中。
Windows操作系統的可執行文件,其格式主要有兩種:EXE和DLL。這里就不必要說這兩種文件格式的區別了吧。如果不知道,這篇文章你估計也看不懂了。
能夠生成COM對象的可執行程序叫COM服務器。EXE是進程外服務器,DLL是進程內服務器。這里只討論DLL的情況。由于DLL本身只能通過對外輸出的函數與外界交互,所以,DLL作為COM服務器也是通過四個輸出函數來體現其服務器的作用。這就是著名的四個函數:
- DllRegisterServer;
- DllUnregisterSever;
- DllGetClassObject;
- DllCanUnloadNow;
?
COM服務器的工作機制可以用下圖來表示:
?
?
?
COM服務器的重要功能可以歸納為三個:
- 管理服務器的生命周期;
- 管理服務器和對象的注冊;
- 獲得COM對象的類廠;
?
我們可以看到,作為COM服務器的DLL,用四個函數來完成這三個方面的功能。四個輸出函數的調用時機分別如下:
- DllRegisterServer、DllUnregisterServer:使用regsvr32程序注冊和反注冊服務器時;
- DllCanUnloadNow:當調用CoFreeUnusedLibraries系統函數時;
- DllGetClassObject:從函數的字面意思來理解,應該是創建COM對象時該函數被調用。而我們知道創建COM對象的API函數是CoCreateInstance。CoCreateInstance是個封裝函數,它包裝了對CoGetClassObject,以及相應類廠的CreateInstance函數的調用。CoGetClassObject通過注冊表機制,找到相應的服務器,并且調用服務器的DllGetClassObject函數來獲得類廠。一旦獲得類廠對象,就可以調用類廠對象的CreateInstance方法來創建COM對象了。
轉載于:https://www.cnblogs.com/Quincy/archive/2010/03/25/1696169.html
總結
以上是生活随笔為你收集整理的[转]COM对象创建-外部机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (解题思路)Entity Framewo
- 下一篇: 一个Quake2的世界浏览器DEMO(附