我對COM的理解

COM,組件對象模型,通俗說就是COM就是提供了一種編程的架構。通過COM規範規定了COM組件應該實現的
一些接口和接口函數,其他程序通過固定的方法使用這些函數,在Windows平臺下,所謂的固定方法通過提供
的各種GUID在註冊表中找到COM組件,然後調用指定的DLL或者EXE(通過ROT)調用指定的函數,以獲得所需要的
接口的指針,所謂的接口的指針其實就是指向函數指針數組的指針,通過接口指針調用COM組件提供的服務。
    如果不借助ATL等類庫等實現COM組件,其實也很簡單,只需要牢記下面幾點就可以了:
    1、使用IDL在idl文件中定義接口。因爲COM是與語言無關的,所以需要一種各種語言等能懂的語言來定義
    接口。使用MIDL編譯編寫好的idl文件可以獲得一個.h文件,從此文件中就可以看出在idl文件中定義的
    接口被編譯成了C++中的純虛類。從這裏也可以得到:
        A、純虛類的內存結構確實是和COM所要求的內存結構相同,所以使用純虛類來定義COM接口;
        B、其實可以不需要idl文件直接使用C++語言定義COM接口,那又爲什麼需要呢?簡單言之,就是爲了
        實現COM的語言無關性。使用C++定義的接口不能被其他語言所使用,當使用IDL語言編寫的idl文件
        被MIDL編譯之後可以生成一個.tlb的類型庫文件,此文件可以被其他語言使用。
    2、接口的實現其實很簡單,就是在繼承了所定義的接口的派生類當中實現就可以了。一個派生類可以繼承
    自多個接口。爲了實現一些功能可以繼承自一些標準的COM接口,比如:IDispatch、IMarshl等,但是一般
    都需要實現IClassFactory或者IClassFactory2接口。類廠接口的作用是提供一個通用的創建組件對象的
    方法。對於進程內組件在C++中我們可以使用new來創建新的對象,但是對於進程外或者是遠程的組件,new
    好像是無能爲力了,所以提供類廠接口,由類廠和代理打交道來完成對象的創建。
    3、組件程序中實現相關的導出函數,以便被其他應用程序調用,比如註冊函數、生命週期控制函數等等。
    4、最後要牢記如果要有不清楚的地方多看MSDN,熟記一些常用的標準接口,對於套間、列集等要特別注意。
    
    無論是在MFC中使用嵌套類來實現COM,還是ATL中使用的多重繼承來實現COM,抑或是使用ODL語言來編寫
接口的定義,其最基本都是上面所說的,只不過MFC和ATL中多了一些宏來替代直接使用C++編寫的各種類定義、
函數定義等,這樣使程序看起來簡潔,但是對於認識COM的原理其實並沒有好處,所以在使用這些宏的時候看看
它們的定義會幫助你更深刻的認識COM。ODL語言只是IDL語言的擴充,其實沒有什麼特別的地方,只要多看看,
弄懂了一些關鍵字的意思就可以了,比如:interface、dispinterface、coclass、import、library、
importlib、defult等等。
    總之要想深刻的認識COM,熟練的使用COM編程,就要如Don所說,多動手編程,多使用它們,並考慮它們
是如何的工作起來的。
發佈了25 篇原創文章 · 獲贊 3 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章