轉自(http://blog.csdn.net/mingojiang/article/details/8159263)數據庫
ActiveX是COM規範的一種實現,前身是OLE(Object Linking and Embedding)。通常讀成:ActiveX Ctronl,譯成:ActiveX控制,ActiveX控件。便可用於桌面也可用於網絡,是封裝、跨平臺(兼容)與重用技術的延伸。封裝與重用技術大概經歷瞭如下幾個歷史階段:服務器
明碼複用:就是寫的代碼,例如一個函數,經過複製粘貼方式重用;網絡
靜態庫:把代碼進行封裝,只讓使用者看到接口,不能看到具體內容,可是編譯時靜態庫將一塊兒載入,致使可執行文件龐大,且不宜升級,若是庫中的內容有改動,則必須再次編譯。架構
動態庫:動態庫發行接口不變的狀況下,無須再編譯主程序,升級方便,並且能夠實現動態載入。框架
COM技術:可是動態庫有環境兼容問題,C#寫的動態庫C++訪問可能會有必定的問題,再一個若是同一臺計算機中有N個程序要用到同一個動態庫,那麼要載入N次。COM技術能解決此問題,經過引用計數技術,只載入一次,你們共用資源,COM技術接口是統一的與語言無關,解決各類語言之間兼容問題。函數
COM+、DCOM技術:COM技術不能解決網絡資源共享問題,只適用於單機,COM+、DCOM技術解決了此問題。不一樣計算機可經過網絡遠程共享資源。工具
ActiveX技術:在COM+、DCOM基礎上發展了可視化,事件驅動,Web調用等。主要是Web上的應用,經過ActiveX技術能讓Web像桌面程序同樣與其餘軟件交互,如讓Web與其餘軟件經過TCP/UDP方式通訊; 也能夠經過ActiveX讓Web與串口通訊。學習
注:ActiveX不支持自定義數據類型,DLL支持開發工具
配套源碼:http://download.csdn.net/detail/mingojiang/4743623字體
隨着軟件技術的發展,程序的開放性、可重用性與封裝變得愈來愈重要,而ActiveX是提升程序的開放性、可重用性和封裝性的重要手段,如今ActiveX已經應用於數據管理、圖形顯示、用戶界面、界面加密與接口封裝等。
對某些技術進行封裝,以供直接調用,由於它有兼容的統一接口,能夠給C++、Delphi、C#與VB等語言調用。應用舉例:
1.有個客戶端C要與服務端S經過UDP協議交互,C端發送的數據包是按某種協議封裝的數據,若是不想(或者說S端不肯意去解析這種複雜的協議)向S端暴露具體協議,那麼咱們能夠用ActiveX技術開發一個ActiveX控件,把C端上行的數據解析成S端默認的一種格式,S端下行給C端的數據,經過ActiveX解析成C端能識別的一種協議。在此解決兩個問題:1、兩種協議的轉換,S端與C端之間相互不須要知道對方細節。2、不一樣平臺的兼容問題,C端多是C開發的,S端多是C#開發的,無論什麼環境ActiveX都能兼容。
2.學校A從IC卡讀卡器生產廠家買了批讀卡器與IC卡,準備開發一個網站,用來讀寫IC卡。IC卡讀卡器與PC機串口相連,點擊頁面上的讀、寫等按鈕能對IC寫進行操做。開發網站用C#開發,直接訪問讀卡器不方便,這時廠家能夠提供一個ActiveX控件,封裝全部對讀卡器的操做,網站直接訪問ActiveX控件便可。
3.車管所部門A是專門管理各個駕校的,A部門開發了一個Web平臺,以供各個駕校上傳其學員學習的動態數據(天天的學習狀況,理論課學了多少小時,實操學了多久等信息)。有些駕校學員動態數據可能保存在電腦上,有些可能保存在學員的IC卡上,有些保存在遠程數據庫上等等,不一樣駕校千差萬別,如何讓不一樣的駕校按A部門的要求上傳數據呢?最好的方法是A部門定義一個統一的接口,例如ActiveX控件,公佈ActiveX的接口、參數定義就可,各個駕校本身按照A部門公佈的要求開發自身的ActiveX控件便可,A部門就不去動管數據的來源,具體實現。
4.WebQQ如何實現的呢?通常的人的作法是藉助數據庫。如A與B兩個QQ聊天,A向B發信息「你好」流程是這樣的:A訪問數據庫把「你好」寫入數據庫,B必定時間內到數據庫查看是否有屬於本身的數據,而後把「你好」下載下來,B向A發信息也是同樣的流程。若是這樣架構是不行的,用戶一多數據庫沒法承受,再一個實時性極差,三這種架構一看就感受很傻。若是用ActiveX會比較好的解決這個問題,開發一個ActiveX控件啓動UDP或者TCP服務,A與B須要交互時,經過服務器知道對方信息,而後創建端對端通訊,A直接向B發信息,B也直接向A發信息,無需經過數據庫。
按運行方式分,可分爲進程內與進程外服務器,進程內是指ActiveX與包容器同一個進程通常以Dll形式發行,進程外是指與包容器不一樣一個進程,其以獨立方式運行,通常以exe文件方式發行。
按運行地點分,可分爲本地服務器與遠程服務器,本地是指ActiveX與包容器同一計算機運行,不言而喻遠程服務器那就是不一樣一計算機上運行。
開發ActiveX的工具通常都是Microsoft提供的,由於ActiveX也是Microsoft提出的嘛,通常有Visual C++ 、Visual Basic、Visual J++、Visual FoxPro各Office系統產品等都能生成ActiveX組件。通常比較全面、靈活的是Visual C++,使用Visual C++時也有四種選擇:
1.使用Microsoft基礎類庫----MFC
2.使用ActiveX模板庫----ALT
3.使用BaseControl框架----BaseCtl
4.本身建框架
是主要選擇,Visual C++提供了完美的支持,可是有幾個小問題,如:把ActiveX作成單實例的----無論客戶程序若是建立實例,都是返回同一個實例。若是使用MFC開發對開發人員的技術要求很高;再如:且MFC開發ActiveX實現雙接口並非不可能,可是要對代碼進行修改,並且可能致使類嚮導沒法工做。
簡單便捷,開發的ActiveX輕便,支持MFC改善了MFC的幾個小問題,並不斷髮展將可能成爲ActiveX開發的主流工具。
BaseCtl並非一個成熟主流的產品,咱們權且不去說它吧
太過繁瑣複雜,不建議用。
MFC適合組件的快速生成與實現,VC++集成開發環境對MFC的支持程序比ALT各BaseC
tl要好,MFC包含的類庫幾乎能解決因此的問題,MFC一應俱全也致使了應用程序開發速度較慢,並且很難實現一些特殊需求。
ATL提供了用於生成ActiveX組件的小型而精緻的框架,然而與MFC比,更缺乏對通用類的支持,ATL與VC++開發環境之間的集成也有待改進。
全部ActiveX組件的信息都保存在註冊表中,沒了註冊表ActiveX將沒法工做。ActiveX的信息存儲在KEY_CLASSES_ROOT鍵下的CLSID子鍵中。
註冊表是一系列數據文件,主要功能是幫助Windows對硬件、軟件、用戶環境以及Windows的「外觀與感受」進行控制。在此以前這類工做主要由Win.ini、System.ini以及程序相應的.ini文件完成。主要經歷瞭如下三個階段的演變:
1.統一記錄於Win.ini與System.ini
2.記錄在本身的ini文件中
3.記錄在註冊表中
Windows註冊表通常分爲五大根鍵:
1.KEY_CLASSES_ROOT :存放的信息是HKEY_LOCAL_MACHINE的一部份,應用程序信息與系統信息。
2.HKEY_CURRENT_USER :存放的信息是HKEY_LOCAL_MACHINE、HKEY_USERS的一部份,當前用戶的全部信息。
3.HKEY_LOCAL_MACHINE :保存用戶信息,計算機中的因此用戶的信息。
4.HKEY_USERS :當前用戶桌面與環境信息。
5.HKEY_CURRENT_CONFIG :計算機硬件等信息。
COM是種規範,叫組件對象模型(Component Object Model),以組件爲發佈單元的對象模型,規範提供了統一的方式進行交互,不依賴於任何語文,也是不一樣語文之類協做開發的一種標準。
COM的主要思想是把一個大項目切成N小塊,每一個小塊能夠由不一樣的團隊,不語言開發只要各個模塊遵循COM規範就可協同工做。這樣靈活化、升級方便、問題快速定位開發自由化。
有關COM的知識參看《Visual C++實踐與提升-COM和COM+篇》。
ActiveX是進程內服務器實現,不能像COM同樣實行進程外。ActiveX容器通常指給ActiveX控件提供支持,還可能經過ActiveX的屬性方法對ActiveX進行控制,同時還能夠響應ActiveX的事件消息。ActiveX控件使用事件來通知ActiveX容器有關ActiveX控件的發生的事情。經常使用的事件有鼠標消息,鍵盤消息等。
屬性可分爲公共屬性與自定義屬性,公共屬性是指ActiveX默認的一些屬性,如Caption、背景色、字體等。自定義屬性是個性定義屬性。
屬性通常有三種實現,以下圖:
第一個實現方法針對公共屬性的,加此屬性後,如加一個Caption屬性後,選擇Stock,在發行的ActiveX控件中會有GetCaption與SetCaption兩個方法,並且方法的實現默認實現,可是沒有具體的屬性,如m_Catption之類的變量。
第二個實現方法對公共屬性與自定義屬性均可用,有具體的屬性變量可明碼調用,在發行的ActiveX控件中也將有Get與Set方法,且默認實現,同時在ActiveX控件中還有一個函數,當相應的屬性改變時,這個函數將被調用。以下圖,當m_backColor被改變時,OnBackColorChanged將被調用:
第三個實現方法,不會有具體的屬性(變量),也不會有默認現實代碼,只是會增長兩個方法(Set和Get),這兩個方法專門操縱某發生用而已,Set帶一參數用來設置某屬性,Get不帶參,返回某一屬性。
些屬性是針對公共屬性的,自定義屬性沒有。公共屬性通常會有Caption、Color、Font等,以Font爲例,選擇Stock,如圖:
發行的ActiveX控件中將會有GetFont與SetFont兩個方法,ActiveX控件自己不會有GetFont與SetFont兩個方法,都是默認實現,也不會有Font的具體屬性。可是Font將默認生效。
以公共屬性Font爲例,當m_font屬性被改變(可經過SetFont改變,也可直接對其進行修改)時OnFontChanged將被調用:
再以自定義屬性m_nCount屬性爲例,在External name輸入屬性名,在Type框中選擇屬性數據類型,以下:
在ActiveX控件中將默認實現Get與Set方法,如GetnCount與SetnCount,並且m_nCount屬性改變時,OnNCountChanged將被調用,可在OnNCountChanged中實現本身的操做。
對屬性初始化:對增長的屬性可初始化,在控件類的實現文件的DoPropExchange方法中加上初始化代碼,以下:
PX_是固定格式,_後面是數據類型,由於m_nCount是long型,因此是PX_Long,若是nCount是short型則是PX_Short,第一個參數pPX是固定格式,第二個參數是屬性名通常是把屬性前面的」m_」去掉後便是,第三個爲屬性自己,第四個爲給屬性武的初始值。
此類型屬性其餘是取/設相應屬性的方法而已,且經過嚮導只會加兩個方法具體實現代碼得本身寫,若是沒不寫具體實現代碼,對ActiveX將無任何影響。至少有一個參數,若是想加其餘參數,可在參數列表中加:
在ActiveX代碼中將增長GetBFlag與SetBFlag方法,實現代碼得本身寫;Type中必須先一個參數類型,在Paramete list列表中可增長其餘參數。
ActiveX的方法是向外公開的接口,經過方法結合屬性可很好的與ActiveX控件通訊,當時還可能過觸發事件的方式來通訊,以下:
此方法是返回一串字符串,參數是字符指針,返回值是long型,實現代碼本身實現,在發行的ActiveX控件中將能訪問到此接口。參數列表中能添加各類類型的參數。
事件分公共事件與自定義事件,是ActiveX主動向ActiveX容器發出通知的一種機制。
經過類嚮導增長事件,輸入事件名:
在External name中輸入名字,這個是外用名,就是AxctiveX發行後,使用者能看到的名字,Internal name是ActiveX內部使用的名字,通常在外用名前加Fire,下面是參數列表,自行配置便可。
自定義事件的觸發:在ActiveX內部相應的地方調用FireUpInfo,ActiveX的包容器中將會收到此事件,自動調用相應的事件,以達到ActiveX主動通知ActiveX包容器的目的。
通常都是鼠標事件與鍵盤輸入事件,默認增長便可,增長後,在ActveX包容器中就能接收到相應的事件,如鼠標按下、彈起、移動等消息。
本人通常不關心界面開發,因此頁面屬性及其餘屬性不深刻研究。