c++ ActiveX基礎1:使用VS2010建立MFC ActiveX工程項目

1.ActiveX的基本概念html

        ActiveX控件能夠看做是一個極小的服務器應用程序,它不能獨立運行,必須嵌入到某個容器程序中,與該容器一塊兒運行。這個容器包括WEB網頁,應用程序窗體等。。。c++

        ActiveX控件的後綴名是OCX或者DLL。通常是以OCX和動態庫共存的形式打包成cab或者exe的文件放在服務器上,客戶端下載後運行安裝cab或exe解壓成OCX和動態庫共存的文件,而後註冊ocx文件。程序員

        ActiveX控件是基於com標準,使得軟件部件在網絡環境中進行交互的技術集。它與具體的編程語言無關。做爲針對Internet應用開發的技術,ActiveX被普遍應用於WEB服務器以及客戶端的各個方面。同時,ActiveX技術也被用於方便地建立普通的桌面應用程序,此外ActiveX通常具備界面。編程

2.三個概念:ActiveX、OLE和COMwindows

       從時間的角度講,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.ActiveX控件工程的建立服務器

      使用VS2010有兩種方式能夠建立ActiveX工程,網絡

第一種:建立「MFC ActiveX 控件」工程;編程語言

第二種:建立「ATL 項目」。因爲使用ATL開發ActiveX控件須要瞭解com技術,對程序員的要求也較高,開發時間也較長,因此若是ActiveX只在windows操做系統下運行,那麼就使用「MFC ActiveX 控件」工程來快速創建ActiveX控件。可是這裏要注意了:使用「MFC ActiveX 控件」工程來快速創建ActiveX控件,他不只要創建在windows操做系統下,還必須在windows操做系統下安裝c++依賴庫安裝包,由於MFC是創建在微軟的c++動態庫的基礎上的。因此這兩種方式各有優缺點,根據項目需求來選擇適合的方式。編輯器

4.使用VS2010建立MFC ActiveX工程項目步驟

        因爲使用ATL進行ActiveX工程的建立難度比較大,因此這裏先使用「MFC ActiveX 控件」工程來建立一個簡單的ActiveX控件。

      第一:新建項目-》選擇「MFC ActiveX 控件」工程,給項目命名TestMfcAtlDebug,點擊肯定,彈出「控件嚮導」對話框

       第二:在概述,應用程序設置,控件名稱和控件設置均可以選擇默認,而後點擊「完成」,這樣「MFC ActiveX 控件」工程建立完成

5.分析「MFC ActiveX 控件」工程的三個重要的類以及對外接口定義文件idl

使用嚮導建立完工程能夠看到自動生成了三個類,TestMfcAtlDebug,TestMfcAtlDebugCtrl和TestMfcAtlDebugPropPage

能夠打開上面三個類的頭文件及cpp文件,發現它們都是派生類。

TestMfcAtlDebug:cpp文件中定義了DllRegisterServer和DllUnregisterServer,能夠發現ActiveX的註冊和反組冊都與該類有關。

TestMfcAtlDebugCtrl:能夠發現該頭文件中聲明瞭消息映射(讓ActiveX控件程序能夠接受系統發送的事件通知,如窗體建立和關閉事件),調度映射(讓外部調用程序(包含ActiveX的容器)能夠方便地訪問ActiveX控件的屬性和方法),事件映射(讓ActiveX控件能夠向外部調用程序(包含ActiveX的容器)發送事件通知)。也就是說對ActiveX控件的窗口操做都將在這個類中完成,包括ActiveX控件的建立,重繪,以及在此類中建立可視MFC窗體。

TestMfcAtlDebugPropPage:顯示ActiveX控件的屬性頁的

讓咱們來看看最重要的部分:對外接口定義文件TestMfcAtlDebug.idl,代碼以下:

#include <olectl.h>
#include <idispids.h>
[ uuid(69EE37F4-8B36-495F-9F60-5E3AAF2FB494), version(1.0),  
 control ]  
library TestMfcAtlDebugLib  
{  
   importlib(STDOLE_TLB);  
   //  CTestMfcAtlDebugCtrl 的主調度接口
   [  
       uuid(6B60346D-5CCD-4907-83F4-51938558A9B7)    
   ]  
   dispinterface _DTestMfcAtlDebug  
   {  
       properties:  
       methods:  
           [id(DISPID_ABOUTBOX)] void AboutBox();  
   };  
   //  CTestMfcAtlDebugCtrl 的事件調度接口
   [  
       uuid(E26ECC46-9BA2-4C25-A4DD-A690560A5113)    
   ]  
   dispinterface _DTestMfcAtlDebugEvents  
   {  
       properties:  
           //  事件接口沒有任何屬性
       methods:  
   };  
   //  CTestMfcAtlDebugCtrl 的類信息
   [  
       uuid(DD0CF7EF-A181-428C-B5FC-C44A1C13CA43)  
   ]  
   coclass TestMfcAtlDebug  
   {  
       [default] dispinterface _DTestMfcAtlDebug;  
       [default, source] dispinterface _DTestMfcAtlDebugEvents;  
   };  
};

 

這個就是對外接口定義文件,若是外部程序想要調用ActiveX的方法,屬性以及在註冊表註冊的classid(WEB網頁調用須要使用),就必須瞭解這個文件,這個文件能夠分爲四個部分來看:

首先是TestMfcAtlDebug.Lib這個庫信息

這個就不作詳解

第二部分是調度映射的接口信息,該接口信息包含了屬性(如控件背景色)和對外方法

裏面定義了一個方法AboutBox(),該方法就能夠被外部程序調用,在該接口裏定義的函數都是純虛函數,這些函數的實現都是在TestMfcAtlDebugCtrl中完成的,MFC經過底層的封裝,讓TestMfcAtlDebugCtrl類繼承這個接口,實現函數。

第三部分是事件映射的接口信息

第四部分是類的信息,其中uuid就是ActiveX控件註冊到註冊表的classid,它是ActiveX註冊後在系統內的惟一標識,WEB網頁就是使用這個ID加載ActiveX控件的

6.定義調度映射和事件映射方法,提供給外部調用者使用
那麼怎麼定義新的調度映射和事件映射方法呢,若是手動定義很不方便,固然使用編譯器進行定義,步驟是打開類視圖:

能夠看到TestMfcAtlDebugLib中有_DTestMfcAtlDebug和_DTestMfcAtlDebugEvents,在_DTestMfcAtlDebug項中能夠右鍵-》添加方法(或屬性),該操做是完成調度映射的方法和屬性的添加;在_DTestMfcAtlDebugEvents項中能夠右鍵-》添加方法(或屬性),該操做是完成事件映射的方法和屬性的添加。

舉個例子,若是要添加一個調度映射的方法Fuck2(),使得外部能夠調用:

在_DTestMfcAtlDebug項中能夠右鍵-》添加方法,設置框

填寫完信息後點擊完成,外部就能夠調用方法Fuck2,同時ActiveX控件項目代碼的內部將會在三個文件中新增代碼:

1.在

2.在

3.在

7.註冊ActiveX控件

按照上面的步驟已經完成簡單ActiveX控件(無窗體界面的控件)的編寫,從新生成後會在Debug下生成一個TestMfcAtlDebug.ocx的文件,使用windows的dos窗口能夠註冊這個ActiveX控件

步驟:

首先win+R鍵打開運行,而後輸入註冊命令:regsvr32  c:\.......\TestMfcAtlDebug.ocx(反註冊命令:regsvr32  c:\.......\TestMfcAtlDebug.ocx -u)

有兩種狀況會致使控件註冊失敗:

第一種:使用非Administrator用戶登入系統會因爲權限不足而沒法註冊com組件,這時候就必須使用Administrator用戶登入操做系統

第二種:ActiveX控件所依賴的dll庫被程序給佔用,就會致使註冊失敗,解決辦法是將正在運行的程序關閉就能夠

8.測試ActiveX控件的方法

按照上面的步驟已經完成ActiveX控件的編寫,也將這個控件註冊成功了,那麼怎麼測試這個控件呢,有三種方式:

第一種:使用html網頁來測試

在TestMfcActiveX.htm的文件中編寫代碼以下:

<HTML>
<HEAD>
<TITLE>Test ActiveX</TITLE>
</HEAD>
<OBJECT ID="TestMfcAtl Control" WIDTH=528 HEIGHT=545 classid="CLSID:DD0CF7EF-A181-428C-B5FC-C44A1C13CA43">
<PARAM NAME="_Version" VALUE="65536">
<PARAM NAME="_ExtentX" VALUE="12806">
<PARAM NAME="_ExtentY" VALUE="1747">
<PARAM NAME="_StockProps" VALUE="0">
</OBJECT>
</HTML>

注意上面的classid就是在idl文件中類的uuid,而後打開這個網頁就會顯示ActiveX控件。上面的classid在控件成功註冊後也能夠經過註冊表查找,具體方法是win+R鍵,輸入regedit命令,就會彈出「註冊表編輯器」,位置在「HKET_CLASSES_ROOT」中,根據你控件的名稱,快速按下前三個字母,而後就能夠定位到比較好找的位置,以下圖

第二種:創建Mfc應用程序,在Mfc窗口右鍵-》插入「ActiveX」控件,而後就會在MFC的窗體上顯示ActiveX控件

第三種:也是最方便的一種方法,就是使用vs自帶的ActiveX Control Test Container來測試ActiveX控件,可是VS2010在「工具」中沒有這一項,那麼咱們首先能夠手動把這個工具添加到VS2010裏,首先找到C:\Program Files\Microsoft Visual Studio 10.0\Samples\2052\C++\MFC\ole\TstCon\TstCon.sln,而後使用VS2010打開解決方案TstCon.sln,編譯項目TCProps和TstCon,編譯完成後會在C:\Program Files\Microsoft Visual Studio 10.0\Samples\2052\C++\MFC\ole\TstCon\Debug\中生成TstCon.exe執行程序,這個執行程序就是ActiveX Control Test Container,接下來咱們就在VS2010中的工具中添加這個TstCon.exe,在VS2010中的「工具」菜單項中選擇「外部工具」,在彈出的窗體中添加一個新的工具,標題爲ActiveX Control Test Container,命令爲C:\Program Files\Microsoft Visual Studio 10.0\Samples\2052\C++\MFC\ole\TstCon\Debug\TstCon.exe,而後點擊肯定就能夠完成工具的添加了。

這樣,在「工具」中就有了一個ActiveX Control Test Container,點擊它就會彈出測試ActiveX的容器,以下圖

點擊Edit->Insert New Control->選擇TestMfcAtlDebug Control,點擊OK

而後就會顯示這個註冊後的AcitveX控件,若是要測試這個控件的調度映射的方法Fuck2,就先選中控件,而後點擊Control-》Invoke Methods,在Methods Name下拉框中選擇Fuck2這個方法,點擊Invoke按鈕就能夠測試這個方法了,以下圖:

咱們能夠看到上面的ActiveX控件是一個空白的背景和一個圈組成的,並無窗體界面,那麼怎麼添加窗體呢?

9.向ActiveX控件中添加一個Mfc窗體,就是一個帶界面的ActiveX控件

步驟:

第一:在資源視圖中新建一個對話框資源

去掉上邊的「肯定」和「取消」按鈕,而後修改對話框屬性:Border改成None,Control改成Ture,ID改成IDD_MAIN_DIALOG,Style改成Child,System改成False,Visible改成True,而後在對話框中雙擊,爲對話框添加一個類,以下圖:

點擊「完成」。在解決方案資源管理器中新增了一個ViewDialog.h和ViewDialog.cpp這個ViewDialog類就是剛剛咱們創建的對話框類

而後拖一個Edit Control到對話框上,修改其ID爲IDC_EDIT_OUTPUT,再拖一個Button到對話框上,此時對話框效果爲:

對話框創建完成,接下來就是要把它添加到ActiveX控件中去

第二:在TestMfcAtlDebugCtrl.h中定義對話框實例m_VideoDlg

而後在TestMfcAtlDebugCtrl類中定義兩個消息映射:窗體建立完成消息映射和窗體改變大小消息映射

在VS2010的菜單項「項目」--》「類嚮導」中,選擇要添加到的項目和類中,選擇「消息」選項卡,選擇WM_CREATE後點擊」添加處理程序「按鈕和選擇WM_SIZE

後點擊」添加處理程序「,這樣在「現有的處理程序」中就有OnCreate和OnSize這兩個函數,點擊肯定,完成消息映射函數的添加,如圖:

在TestMfcAtlDebugCtrl.cpp中自動添加下列代碼,如圖:

在OnCreate函數中編寫以下代碼(Create是在ActiveX控件中建立一個窗體對話框,IDD_VIEW_DIALOG就是剛剛新建的對話框):

在OnSize函數編寫代碼以下(MoveWindow是肯定窗體對話框在ActiveX中的大小):

第三:從新編譯,註冊ocx,使用ActiveX Control Test Container再次測試該控件

能夠發現這個ActiveX控件中已經有了界面了

相關文章
相關標籤/搜索