ActiveX開發詳解

一、ActiveX基礎

1.1什麼是ActiveX

        ActiveXCOM規範的一種實現,前身是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

轉載請註明出自:http://blog.csdn.net/MingoJiang

 

1.2ActiveX應用領域

        隨着軟件技術的發展,程序的開放性、可重用性與封裝變得越來越重要,而ActiveX是提高程序的開放性、可重用性和封裝性的重要手段,現在ActiveX已經應用於數據管理、圖形顯示、用戶界面、界面加密與接口封裝等。

對某些技術進行封裝,以供直接調用,因爲它有兼容的統一接口,可以給C++DelphiC#VB等語言調用。應用舉例:

        1.有個客戶端C要與服務端S通過UDP協議交互,C端發送的數據包是按某種協議封裝的數據,如果不想(或者說S端不願意去解析這種複雜的協議)S端暴露具體協議,那麼我們可以用ActiveX技術開發一個ActiveX控件,把C端上行的數據解析成S端默認的一種格式,S端下行給C端的數據,通過ActiveX解析成C端能識別的一種協議。在此解決兩個問題:一、兩種協議的轉換,S端與C端之間相互不需要知道對方細節。二、不同平臺的兼容問題,C端可能是C開發的,S端可能是C#開發的,不管什麼環境ActiveX都能兼容。

        2.學校AIC卡讀卡器生產廠家買了批讀卡器與IC卡,準備開發一個網站,用來讀寫IC卡。IC卡讀卡器與PC機串口相連,點擊頁面上的讀、寫等按鈕能對IC寫進行操作。開發網站用C#開發,直接訪問讀卡器不方便,這時廠家可以提供一個ActiveX控件,封裝所有對讀卡器的操作,網站直接訪問ActiveX控件即可。

        3.車管所部門A是專門管理各個駕校的,A部門開發了一個Web平臺,以供各個駕校上傳其學員學習的動態數據(每天的學習情況,理論課學了多少小時,實操學了多久等信息)。有些駕校學員動態數據可能保存在電腦上,有些可能保存在學員的IC卡上,有些保存在遠程數據庫上等等,不同駕校千差萬別,如何讓不同的駕校按A部門的要求上傳數據呢?最好的方法是A部門定義一個統一的接口,例如ActiveX控件,公佈ActiveX的接口、參數定義就可,各個駕校自己按照A部門公佈的要求開發自身的ActiveX控件即可,A部門就不去動管數據的來源,具體實現。

        4.WebQQ如何實現的呢?一般的人的做法是藉助數據庫。如AB兩個QQ聊天,AB發信息“你好”流程是這樣的:A訪問數據庫把“你好”寫入數據庫,B一定時間內到數據庫查看是否有屬於自己的數據,然後把“你好”下載下來,BA發信息也是一樣的流程。如果這樣架構是不行的,用戶一多數據庫無法承受,再一個實時性極差,三這種架構一看就感覺很傻。如果用ActiveX會比較好的解決這個問題,開發一個ActiveX控件啓動UDP或者TCP服務,AB需要交互時,通過服務器知道對方信息,然後建立端對端通信,A直接向B發信息,B也直接向A發信息,無需通過數據庫。

1.3ActiveX分類

        按運行方式分,可分爲進程內與進程外服務器,進程內是指ActiveX與包容器同一個進程一般以Dll形式發行,進程外是指與包容器不同一個進程,其以獨立方式運行,一般以exe文件方式發行。

        按運行地點分,可分爲本地服務器與遠程服務器,本地是指ActiveX與包容器同一計算機運行,不言而喻遠程服務器那就是不同一計算機上運行。

 

二、ActiveX開發工具

2.1選擇適合的開發工具

        開發ActiveX的工具一般都是Microsoft提供的,因爲ActiveX也是Microsoft提出的嘛,一般有Visual C++ Visual BasicVisual J++Visual FoxProOffice系統產品等都能生成ActiveX組件。一般比較全面、靈活的是Visual C++,使用Visual C++時也有四種選擇:

        使用Microsoft基礎類庫----MFC

        使用ActiveX模板庫----ALT

        使用BaseControl框架----BaseCtl

        自己建框架

2.1.1MFC開發ActiveX

        是主要選擇,Visual C++提供了完美的支持,但是有幾個小問題,如:把ActiveX做成單實例的----不管客戶程序如果創建實例,都是返回同一個實例。如果使用MFC開發對開發人員的技術要求很高;再如:且MFC開發ActiveX實現雙接口並不是不可能,但是要對代碼進行修改,而且可能導致類嚮導無法工作。

2.1.2ALT開發ActiveX

        簡單便捷,開發的ActiveX輕便,支持MFC改善了MFC的幾個小問題,並不斷髮展將可能成爲ActiveX開發的主流工具。

2.1.3 BaseCtl開發ActiveX

        BaseCtl並不是一個成熟主流的產品,我們權且不去說它吧

2.1.4自己寫框架

        太過繁瑣複雜,不建議用。

2.1.5工具選擇小結

         MFC適合組件的快速生成與實現,VC++集成開發環境對MFC的支持程序比ALTBaseC

tl要好,MFC包含的類庫幾乎能解決所以的問題,MFC包羅萬象也導致了應用程序開發速度較慢,而且很難實現一些特殊需求。

        ATL提供了用於生成ActiveX組件的小型而精緻的框架,然而與MFC比,更缺少對通用類的支持,ATLVC++開發環境之間的集成也有待改進。

 

2.2註冊表與ActiveX

        所有ActiveX組件的信息都保存在註冊表中,沒了註冊表ActiveX將無法工作。ActiveX的信息存儲在KEY_CLASSES_ROOT鍵下的CLSID子鍵中。

2.2.1註冊表發展史

        註冊表是一系列數據文件,主要功能是幫助Windows對硬件、軟件、用戶環境以及Windows的“外觀與感覺”進行控制。在此之前這類工作主要由Win.iniSystem.ini以及程序相應的.ini文件完成。主要經歷了以下三個階段的演變:

        統一記錄於Win.iniSystem.ini

        記錄在自己的ini文件中

        記錄在註冊表中

2.2.2註冊表結構

        Windows註冊表一般分爲六大根鍵:KEY_CLASSES_ROOTHKEY_CURRENT_USERHKEY_LOCAL_MACHINEHKEY_USERSHKEY_CURRENT_CONFIGKEY_CLASSES_ROOTHKEY

_CURRENT_USER中存放的信息是HKEY_LOCAL_MACHINE的一部份,HKEY_CURRENT_USER存放的信息是HKEY_USERS的一部份。

HKEY_USERS:保存用戶信息,計算機中的所以用戶的信息。

HKEY_CURRENT_USER:當前用戶的所有信息。

HKEY_CURRENT_CONFIG:當前用戶桌面與環境信息。

KEY_CLASSES_ROOT:應用程序信息與系統信息。

HKEY_LOCAL_MACHINE:計算機硬件等信息。

 

三、ActiveX基礎----COM

3.1什麼是COM

        COM是種規範,叫組件對象模型,以組件爲發佈單元的對象模型,規範提供了統一的方式進行交互,不依賴於任何語文,也是不同語文之類協作開發的一種標準。

        COM的主要思想是把一個大項目切成N小塊,每個小塊可以由不同的團隊,不語言開發只要各個模塊遵循COM規範就可協同工作。這樣靈活化、升級方便、問題快速定位開發自由化。

        有關COM的知識參看《Visual C++實踐與提高-COMCOM+篇》。

 

四、使用MFC開發ActiveX

4.1ActiveX基本概念

        ActiveX是進程內服務器實現,不能像COM一樣實行進程外。ActiveX容器一般指給ActiveX控件提供支持,還可能通過ActiveX的屬性方法對ActiveX進行控制,同時還可以響應ActiveX的事件消息。ActiveX控件使用事件來通知ActiveX容器有關ActiveX控件的發生的事情。常用的事件有鼠標消息,鍵盤消息等。

4.2屬性

        屬性可分爲公共屬性與自定義屬性,公共屬性是指ActiveX默認的一些屬性,如Caption、背景色、字體等。自定義屬性是個性定義屬性。

        屬性一般有三種實現,如下圖:

第一個實現方法針對公共屬性的,加此屬性後,如加一個Caption屬性後,選擇Stock,在發行的ActiveX控件中會有GetCaptionSetCaption兩個方法,而且方法的實現默認實現,但是沒有具體的屬性,如m_Catption之類的變量。

        第二個實現方法對公共屬性與自定義屬性都可用,有具體的屬性變量可明碼調用,在發行的ActiveX控件中也將有GetSet方法,且默認實現,同時在ActiveX控件中還有一個函數,當相應的屬性改變時,這個函數將被調用。如下圖,當m_backColor被改變時,OnBackColorChanged將被調用:

        第三個實現方法,不會有具體的屬性(變量),也不會有默認現實代碼,只是會增加兩個方法(SetGet),這兩個方法專門操縱某發生用而已,Set帶一參數用來設置某屬性,Get不帶參,返回某一屬性。

4.2.1Stock實現屬性

        些屬性是針對公共屬性的,自定義屬性沒有。公共屬性一般會有CaptionColorFont等,以Font爲例,選擇Stock,如圖:

發行的ActiveX控件中將會有GetFontSetFont兩個方法,ActiveX控件本身不會有GetFontSetFont兩個方法,都是默認實現,也不會有Font的具體屬性。但是Font將默認生效。

 

4.2.2通知特性屬性

        以公共屬性Font爲例,當m_font屬性被改變(可通過SetFont改變,也可直接對其進行修改)OnFontChanged將被調用:

        再以自定義屬性m_nCount屬性爲例,在External name輸入屬性名,在Type框中選擇屬性數據類型,如下:

ActiveX控件中將默認實現GetSet方法,如GetnCountSetnCount,而且m_nCount屬性改變時,OnNCountChanged將被調用,可在OnNCountChanged中實現自己的操作。

        對屬性初始化:對增加的屬性可初始化,在控件類的實現文件的DoPropExchange方法中加上初始化代碼,如下:

PX_是固定格式,_後面是數據類型,因爲m_nCountlong型,所以是PX_Long,如果nCountshort型則是PX_Short,第一個參數pPX是固定格式,第二個參數是屬性名一般是把屬性前面的”m_”去掉後即是,第三個爲屬性本身,第四個爲給屬性武的初始值。

        

4.2.3Get/Set類型屬性

        此類型屬性其他是取/設相應屬性的方法而已,且通過嚮導只會加兩個方法具體實現代碼得自己寫,如果沒不寫具體實現代碼,對ActiveX將無任何影響。至少有一個參數,如果想加其他參數,可在參數列表中加:

ActiveX代碼中將增加GetBFlagSetBFlag方法,實現代碼得自己寫;Type中必須先一個參數類型,在Paramete list列表中可增加其他參數。

4.3方法

        ActiveX的方法是向外公開的接口,通過方法結合屬性可很好的與ActiveX控件通信,當時還可能過觸發事件的方式來通信,如下:

此方法是返回一串字符串,參數是字符指針,返回值是long型,實現代碼自己實現,在發行的ActiveX控件中將能訪問到此接口。參數列表中能添加各種類型的參數。

 

4.4事件

        事件分公共事件與自定義事件,是ActiveX主動向ActiveX容器發出通知的一種機制。

4.4.1自定義事件

        通過類嚮導增加事件,輸入事件名:

External name中輸入名字,這個是外用名,就是AxctiveX發行後,使用者能看到的名字,Internal nameActiveX內部使用的名字,一般在外用名前加Fire,下面是參數列表,自行配置即可。

        自定義事件的觸發:ActiveX內部相應的地方調用FireUpInfoActiveX的包容器中將會收到此事件,自動調用相應的事件,以達到ActiveX主動通知ActiveX包容器的目的。

 

4.4.2公共事件

        一般都是鼠標事件與鍵盤輸入事件,默認增加即可,增加後,在ActveX包容器中就能接收到相應的事件,如鼠標按下、彈起、移動等消息。

4.5頁面屬性及其他

        本人一般不關心界面開發,所以頁面屬性及其他屬性不深入研究。

 

 

配套源碼:http://download.csdn.net/detail/mingojiang/4743623

轉載請註明出自:http://blog.csdn.net/MingoJiang

交流QQ:1148824289

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章