天天看點

com元件開發難學之原因淺析

再次叩問讓我屢次碰得頭破血流的com,讓我對她的認知更近一步。

       com是個好東西,office自動化程式設計,active插件,vs studio插件,ie插件,動态腳本支援,她的應用如此吸引着我,然而,她又是如此的可望而不可即。

       最近先是由于項目中使用wtl,而開始研讀wtl源碼,以及學習領悟一些windows程式設計機制,進而拐入了mfc,随之又牽扯到了atl,于是再次與老冤家com碰頭。感覺個人學習知識,飄忽不定,今天wtl呢,明天就mfc了,幾年的技術學習之路,有一些螺旋式上升的感覺,今天來個倒叙,從最近的atl開始談起。改日再記錄個人對wtl和mfc的體會。

com在我上述提到的一些技術中,對我個人來說是最為博大精深的了,以自己近日對其粗淺的認識,亂侃幾句。com其難學有多方面原因:

1.預備知識較多:首先要有深厚的c++功底,然後要了解com理論,com對象,com伺服器,著名的IUnknown,IDispatch等接口,了解了這些之後,我們不能使用原始的com sdk來開發com元件,接下來就要學習mfc或atl實作的com架構,mfc不是專門服務com的,這裡不論;誠然利用atl可以快速的實作自己com元件,然而alt庫本身的了解,又是一道難關;簡單看了幾眼《深入解析atl》之後的感覺是,atl為我們實作了一些,我們自己實作com元件一些必須實作而實作起來又相似的東西,比如IUnknown接口,接口查詢,聚合的支援,com伺服器的類工廠,com伺服器的注冊,線程模型,以及一些常用的工具類,如智能指針,bstr等。我們在掌握atl為我們所做的工作的基礎(這需要我們對com原理的了解)上,就可以專心實作我們自己的接口功能了。

class ATL_NO_VTABLE CFun :

              public CComObjectRootEx<CComSingleThreadModel>,

              public CComCoClass<CFun, &CLSID_Fun>,

              public IFun

利用atl生成基本代碼結構如上,其中CComObjectRootEx<CComSingleThreadModel>,替我們作好了IUnkown的工作,CComCoClass<CFun, &CLSID_Fun>替我們做了産生類廠,注冊伺服器的工作,而IFun是我們自己定義的接口,我們的CFun要實作它,最開始接觸atl的時候,被這個多繼承搞糊塗了,直到今天才稍微清晰些,這裡的繼承有兩層含義:

1, 繼承atl庫為我們提供的類,享受其給我們提供的服務(atl提供給我們的服務遠不止這些,一大堆IxxxImp名字的類;

2,實作我們自己的接口,最終提供給别人使用。

好了,這就是自己對于atl的泛泛的了解。

好,假設你對atl有很好的了解,那麼你可以掌握com了麼,還遠遠不夠,還有一道難關要闖---ole2。

就是你實作一個ActiveX插件,或實作一個包容控件的應用,所需要知道的一切,通過閱讀atl的源代碼也可以看出這一點,随便列幾個接口,

IViewObject,IDropSource,IDropTarget,IOleObject,IOleClientSite,IOleInPlaceObject,IOleControl,IOleControlSite...

你需要了解以上這些接口的目的,以及它們之間的互動,很好的了解了它們,才能很好的了解com,個中原因就需要我們追溯com的起源了:

OLE是最早出現的,自從 Windows作業系統流行以來,“剪貼闆”(Clipboard)首先解決了不同程式間的通信問題(由剪貼闆作為資料交換中心,進行複制、粘貼的操作),但是剪貼闆傳遞的都是“死”資料,應用程式開發者得自行編寫、解析資料格式的代碼,于是動态資料交換(Dynamic Data Exchange,DDE)的通信協定應運而生,它可以讓應用程式之間自動擷取彼此的最新資料,但是,解決彼此之間的“資料格式”轉換仍然是程式員沉重的負擔。對象的連結與嵌入(Object Linking and Embedded,OLE)的誕生把原來應用程式的資料交換提高到“對象交換”,這樣程式間不但獲得資料也同樣獲得彼此的應用程式對象,并且可以直接使用彼此的資料内容,其實OLE是Microsoft的複合文檔技術,它的最初版本隻是瞄準複合文檔,但在後續版本OLE2中,導入了COM。

由此可見,COM是應OLE的需求而誕生的,是以雖然COM是OLE的基礎,但OLE的産生卻在COM之前。COM的基本出發點是,讓某個軟體通過一個通用的機構為另一個軟體提供服務。COM是應OLE的需求而誕生,但它的第一個使用者卻是OLE2。

COM第一個使用者是OLE2,是以我們了解com标準,最好不過是掌握ole2了,然而說來容易,做起來難啊。

大家都說com難學,自己試以此文剖析了其難學的原因。吾以為更重要的一點原因是,現在已是一個“無網而不勝”的時代,是java,.net的時代,需求為導向,誰還會舍近而求遠,退而求其次呢?

然而,本着追尋技術之流脈的目的,了解一下也沒什麼壞處的。

也許有一天,和com會再次不期而遇,也許是要将日志導入到excel這樣的小需求,也是是開發一個支援插件的可擴充應用。

本文轉自 xchsp 51CTO部落格,原文連結:http://blog.51cto.com/freebird/184567,如需轉載請自行聯系原作者