1.ActiveX的基本概念html
ActiveX控件能夠看做是一個極小的服務器應用程序,它不能獨立運行,必須嵌入到某個容器程序中,與該容器一塊兒運行。這個容器包括WEB網頁,應用程序窗體等。。。編程
ActiveX控件的後綴名是OCX或者DLL。通常是以OCX和動態庫共存的形式打包成cab或者exe的文件放在服務器上,客戶端下載後運行安裝cab或exe解壓成OCX和動態庫共存的文件,而後註冊ocx文件。瀏覽器
ActiveX控件是基於com標準,使得軟件部件在網絡環境中進行交互的技術集。它與具體的編程語言無關。做爲針對Internet應用開發的技術,ActiveX被普遍應用於WEB服務器以及客戶端的各個方面。同時,ActiveX技術也被用於方便地建立普通的桌面應用程序,此外ActiveX通常具備界面。服務器
2.三個概念:ActiveX、OLE和COM網絡
從時間的角度講,OLE是最先出現的,而後是COM和 ActiveX;從體系結構角度講,OLE和ActiveX是創建在COM之上的,因此COM是基礎;單從名稱角度講,OLE、ActiveX是兩個商標名稱,而COM則是一個純技術名詞,這也是你們更多的據說ActiveX和OLE的緣由。COM是應OLE的需求而誕生的,因此雖然COM是OLE的基礎,但OLE的產生卻在COM以前。COM的基本出發點是,讓某個軟件經過一個通用的機構爲另外一個軟件提供服務。ActiveX最核心的技術仍是COM。ActiveX和OLE的最大不一樣在於,OLE針對的是桌面上應用軟件和文件之間的集成,而 ActiveX則以提供進一步的網絡應用與用戶交互爲主。COM對象能夠用C++、Java和VB等任意一種語言編寫,並能夠用DLL或做爲不一樣過程工做的執行文件的形式來實現。使用COM對象的瀏覽器,無需關心對象是用什麼語言寫的,也無須關心它是以DLL仍是以另外的過程來執行的。從瀏覽器端看,無任何區別。這樣一個通用的處理技巧很是有用。編程語言
3.VS2010建立ActiveX函數
新建名爲MyFirstActive的工程,如圖工具
點擊【ok】,隨後一路保持默認便可,最後點擊【Finish】按鈕測試
能夠打開上面三個類的頭文件及cpp文件,發現它們都是派生類。ui
MyFirstActive.cpp:cpp文件中定義了DllRegisterServer和DllUnregisterServer,能夠發現ActiveX的註冊和反組冊都與該類有關。
MyFirstActiveCtrl.cpp:能夠發現該頭文件中聲明瞭消息映射(讓ActiveX控件程序能夠接受系統發送的事件通知,如窗體建立和關閉事件),調度映射(讓外部調用程序(包含ActiveX的容器)能夠方便地訪問ActiveX控件的屬性和方法),事件映射(讓ActiveX控件能夠向外部調用程序(包含ActiveX的容器)發送事件通知)。也就是說對ActiveX控件的窗口操做都將在這個類中完成,包括ActiveX控件的建立,重繪,以及在此類中建立可視MFC窗體。
MyFirstActivePropPage.cpp:顯示ActiveX控件的屬性頁的
最重要的對外接口定義文件MyFirstActive.idl,代碼以下:
// MyFirstActive.idl : type library source for ActiveX Control project. // This file will be processed by the MIDL compiler tool to // produce the type library (MyFirstActive.tlb) that will become a resource in // MyFirstActive.ocx. #include <olectl.h> #include <idispids.h> [ uuid(0FEFC517-CA1A-4178-B11F-5CE5CF0861DB), version(1.0), control ] library MyFirstActiveLib { importlib(STDOLE_TLB); // Primary dispatch interface for CMyFirstActiveCtrl [ uuid(9B11CEE7-1974-4579-ACDD-551DD26AC5D9) ] dispinterface _DMyFirstActive { properties: methods: [id(DISPID_ABOUTBOX)] void AboutBox(); }; // Event dispatch interface for CMyFirstActiveCtrl [ uuid(28CECEEF-A69E-4124-82AD-FE45F093FE84) ] dispinterface _DMyFirstActiveEvents { properties: // Event interface has no properties methods: }; // Class information for CMyFirstActiveCtrl [ uuid(260A0C6E-1C89-4BB7-A0DD-C1496245094B) ] coclass MyFirstActive { [default] dispinterface _DMyFirstActive; [default, source] dispinterface _DMyFirstActiveEvents; }; };
這個就是對外接口定義文件,若是外部程序想要調用ActiveX的方法,屬性以及在註冊表註冊的classid(WEB網頁調用須要使用),就必須瞭解這個文件,這個文件能夠分爲四個部分來看:
首先是MyFirstActiveLib這個庫信息
第二部分是調度映射的接口信息,該接口信息包含了屬性(如控件背景色)和對外方法
裏面定義了一個方法AboutBox(),該方法就能夠被外部程序調用,在該接口裏定義的函數都是純虛函數,這些函數的實現都是在MyFirstActiveCtrl.cpp中完成的,MFC經過底層的封裝,讓MyFirstActiveCtrl類繼承這個接口,實現函數。
第三部分是事件映射的接口信息
第四部分是類的信息,其中uuid就是ActiveX控件註冊到註冊表的classid,它是ActiveX註冊後在系統內的惟一標識,WEB網頁就是使用這個ID加載ActiveX控件的
編譯,就會生成MyFirstActive.ocx,下面講一下使用方法:
1.使用html網頁
<HTML>
<HEAD>
<TITLE>Test ActiveX</TITLE>
</HEAD>
<OBJECT ID="TestMfcAtl Control" WIDTH=800 HEIGHT=545 classid="CLSID:260A0C6E-1C89-4BB7-A0DD-C1496245094B">
<PARAM NAME="_Version" VALUE="65536">
<PARAM NAME="_ExtentX" VALUE="12806">
<PARAM NAME="_ExtentY" VALUE="1747">
<PARAM NAME="_StockProps" VALUE="0">
</OBJECT>
</HTML>
2.創建Mfc應用程序,在Mfc窗口右鍵-》插入「ActiveX」控件,而後就會在MFC的窗體上顯示ActiveX控件
3.也是最方便的一種方法,就是使用vs自帶的ActiveX Control Test Container來測試ActiveX控件,可是VS2010在「工具」中沒有這一項,那麼咱們首先能夠手動把這個工具添加到VS2010裏,
首先,打開C:\Program Files\Microsoft Visual Studio 10.0\Samples\1033,解壓VC2010Samples.zip
解壓後,再打開目錄C:\Program Files\Microsoft Visual Studio 10.0\Samples\1033\VC2010Samples\C++\MFC\ole\TstCon,打開TstCon.sln
編譯,生成TstCon.exe,而後把這個exe導入到VS2010中,點擊【Tools】——【External Tools】,
Command路徑就是剛纔生成TstCon.exe的路徑,Title就是一個名稱,隨便你起均可以的,最後點擊ok,這個外部exe就添加成功了。
怎麼使用?點擊【Tools】——【ActiveX Control Test Container】以下
再點擊【Edit】——【Insert newControl】
選擇MyFirstCtrl,這裏咱們沒有手動註冊,實際上是VS2010在生成ocx的時候就已經註冊好了
而後點擊【ok】按鈕,以下
中間沒跳出什麼異常,顯示上圖畫面,說明咱們的ocx建立成功了(固然使用的是默認的,什麼都沒有)
下面咱們在Ocx中添加一些圖形控件用於顯示和操做,首先,插入一個對話框資源
生成一個IDD_DIALOG1,而後修改對話框屬性:Border改成None,Control改成True,Style改成Child,Visible改成True, 而後雙擊該對話框,生成一個與之關聯的類,這裏起名CActiveXTestDlg
點擊【Finish】。
在MyFirstActiveCtrl.h中添加以下代碼:
用Class Wizard爲CMyFirstActiveCtrl類添加OnCreate函數
在MyFirstActiveCtrl.h中自動生成以下代碼
在MyFirstActiveCtrl.cpp中自動生成以下代碼
而後,在該函數中建立對話框的對象
int CMyFirstActiveCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (COleControl::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here m_ActiveXTestDlg.Create(IDD_DIALOG1, this); return 0; }
編譯,用外部工具加載ocx(前面已講),結果以下(若是看不到對話框,能夠把矩形框拉大就能夠看到了)
這樣帶界面的ocx就生成了,另外能夠在CActiveXTestDlg類中加入【ok】按鈕響應函數
void CActiveXTestDlg::OnBnClickedOk() { // TODO: Add your control notification handler code here //CDialogEx::OnOK(); AfxMessageBox(_T("ActiveX test is ok!")); }
這樣,在測試程序中點擊【ok】按鈕,就會彈出以下對話框
備註:若是想要修改初始的ActiveX控件大小,能夠在CMyFirstActiveCtrl構造函數中調用 SetInitialSize( 470, 295 ); 來設置
ActiveX控件跟蹤調試:
運行TstCon.exe,而後用ocx的工程Attach到該exe,就能夠調試了。