使用VS2010創(chuàng)建MFC ActiveX工程項(xiàng)目
1.ActiveX的基本概念
ActiveX控件可以看作是一個(gè)極小的服務(wù)器應(yīng)用程序,它不能獨(dú)立運(yùn)行,必須嵌入到某個(gè)容器程序中,與該容器一起運(yùn)行。這個(gè)容器包括WEB網(wǎng)頁,應(yīng)用程序窗體等。。。
ActiveX控件的后綴名是OCX或者DLL。一般是以O(shè)CX和動(dòng)態(tài)庫共存的形式打包成cab或者exe的文件放在服務(wù)器上,客戶端下載后運(yùn)行安裝cab或exe解壓成OCX和動(dòng)態(tài)庫共存的文件,然后注冊(cè)ocx文件。
ActiveX控件是基于com標(biāo)準(zhǔn),使得軟件部件在網(wǎng)絡(luò)環(huán)境中進(jìn)行交互的技術(shù)集。它與具體的編程語言無關(guān)。作為針對(duì)Internet應(yīng)用開發(fā)的技術(shù),ActiveX被廣泛應(yīng)用于WEB服務(wù)器以及客戶端的各個(gè)方面。同時(shí),ActiveX技術(shù)也被用于方便地創(chuàng)建普通的桌面應(yīng)用程序,此外ActiveX一般具有界面。
2.三個(gè)概念:ActiveX、OLE和COM
從時(shí)間的角度講,OLE是最早出現(xiàn)的,然后是COM和 ActiveX;從體系結(jié)構(gòu)角度講,OLE和ActiveX是建立在COM之上的,所以COM是基礎(chǔ);單從名稱角度講,OLE、ActiveX是兩個(gè)商標(biāo)名稱,而COM則是一個(gè)純技術(shù)名詞,這也是大家更多的聽說ActiveX和OLE的原因。COM是應(yīng)OLE的需求而誕生的,所以雖然COM是OLE的基礎(chǔ),但OLE的產(chǎn)生卻在COM之前。COM的基本出發(fā)點(diǎn)是,讓某個(gè)軟件通過一個(gè)通用的機(jī)構(gòu)為另一個(gè)軟件提供服務(wù)。ActiveX最核心的技術(shù)還是COM。ActiveX和OLE的最大不同在于,OLE針對(duì)的是桌面上應(yīng)用軟件和文件之間的集成,而 ActiveX則以提供進(jìn)一步的網(wǎng)絡(luò)應(yīng)用與用戶交互為主。COM對(duì)象可以用C++、Java和VB等任意一種語言編寫,并可以用DLL或作為不同過程工作的執(zhí)行文件的形式來實(shí)現(xiàn)。使用COM對(duì)象的瀏覽器,無需關(guān)心對(duì)象是用什么語言寫的,也無須關(guān)心它是以DLL還是以另外的過程來執(zhí)行的。從瀏覽器端看,無任何區(qū)別。這樣一個(gè)通用的處理技巧非常有用。
3.ActiveX控件工程的創(chuàng)建
使用VS2010有兩種方式可以創(chuàng)建ActiveX工程,
第一種:創(chuàng)建“MFC ActiveX 控件”工程;
第二種:創(chuàng)建“ATL 項(xiàng)目”。由于使用ATL開發(fā)ActiveX控件需要了解com技術(shù),對(duì)程序員的要求也較高,開發(fā)時(shí)間也較長(zhǎng),所以如果ActiveX只在windows操作系統(tǒng)下運(yùn)行,那么就使用“MFC ActiveX 控件”工程來快速建立ActiveX控件。但是這里要注意了:使用“MFC ActiveX 控件”工程來快速建立ActiveX控件,他不僅要建立在windows操作系統(tǒng)下,還必須在windows操作系統(tǒng)下安裝c++依賴庫安裝包,因?yàn)镸FC是建立在微軟的c++動(dòng)態(tài)庫的基礎(chǔ)上的。所以這兩種方式各有優(yōu)缺點(diǎn),根據(jù)項(xiàng)目需求來選擇適合的方式。
4.使用VS2010創(chuàng)建MFC ActiveX工程項(xiàng)目步驟
由于使用ATL進(jìn)行ActiveX工程的創(chuàng)建難度比較大,所以這里先使用“MFC ActiveX 控件”工程來創(chuàng)建一個(gè)簡(jiǎn)單的ActiveX控件。
第一:新建項(xiàng)目-》選擇“MFC ActiveX 控件”工程,給項(xiàng)目命名TestMfcAtlDebug,點(diǎn)擊確定,彈出“控件向?qū)А睂?duì)話框
第二:在概述,應(yīng)用程序設(shè)置,控件名稱和控件設(shè)置都可以選擇默認(rèn),然后點(diǎn)擊“完成”,這樣“MFC ActiveX 控件”工程創(chuàng)建完成
5.分析“MFC ActiveX 控件”工程的三個(gè)重要的類以及對(duì)外接口定義文件idl
使用向?qū)?chuàng)建完工程可以看到自動(dòng)生成了三個(gè)類,TestMfcAtlDebug,TestMfcAtlDebugCtrl和TestMfcAtlDebugPropPage
可以打開上面三個(gè)類的頭文件及cpp文件,發(fā)現(xiàn)它們都是派生類。
TestMfcAtlDebug:cpp文件中定義了DllRegisterServer和DllUnregisterServer,可以發(fā)現(xiàn)ActiveX的注冊(cè)和反組冊(cè)都與該類有關(guān)。
TestMfcAtlDebugCtrl:可以發(fā)現(xiàn)該頭文件中聲明了消息映射(讓ActiveX控件程序可以接受系統(tǒng)發(fā)送的事件通知,如窗體創(chuàng)建和關(guān)閉事件),調(diào)度映射(讓外部調(diào)用程序(包含ActiveX的容器)可以方便地訪問ActiveX控件的屬性和方法),事件映射(讓ActiveX控件可以向外部調(diào)用程序(包含ActiveX的容器)發(fā)送事件通知)。也就是說對(duì)ActiveX控件的窗口操作都將在這個(gè)類中完成,包括ActiveX控件的創(chuàng)建,重繪,以及在此類中創(chuàng)建可視MFC窗體。
TestMfcAtlDebugPropPage:顯示ActiveX控件的屬性頁的
讓我們來看看最重要的部分:對(duì)外接口定義文件TestMfcAtlDebug.idl,代碼如下:
#include <olectl.h> #include <idispids.h> [ uuid(69EE37F4-8B36-495F-9F60-5E3AAF2FB494), version(1.0), control ] library TestMfcAtlDebugLib { importlib(STDOLE_TLB); // CTestMfcAtlDebugCtrl 的主調(diào)度接口 [ uuid(6B60346D-5CCD-4907-83F4-51938558A9B7) ] dispinterface _DTestMfcAtlDebug { properties: methods: [id(DISPID_ABOUTBOX)] void AboutBox(); }; // CTestMfcAtlDebugCtrl 的事件調(diào)度接口 [ 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; }; };
[這個(gè)就是對(duì)外接口定義文件,如果外部程序想要調(diào)用ActiveX的方法,屬性以及在注冊(cè)表注冊(cè)的classid(WEB網(wǎng)頁調(diào)用需要使用),就必須了解這個(gè)文件,這個(gè)文件可以分為四個(gè)部分來看:
首先是TestMfcAtlDebug.Lib這個(gè)庫信息
這個(gè)就不做詳解
第二部分是調(diào)度映射的接口信息,該接口信息包含了屬性(如控件背景色)和對(duì)外方法
里面定義了一個(gè)方法AboutBox(),該方法就可以被外部程序調(diào)用,在該接口里定義的函數(shù)都是純虛函數(shù),這些函數(shù)的實(shí)現(xiàn)都是在TestMfcAtlDebugCtrl中完成的,MFC通過底層的封裝,讓TestMfcAtlDebugCtrl類繼承這個(gè)接口,實(shí)現(xiàn)函數(shù)。
第三部分是事件映射的接口信息
第四部分是類的信息,其中uuid就是ActiveX控件注冊(cè)到注冊(cè)表的classid,它是ActiveX注冊(cè)后在系統(tǒng)內(nèi)的唯一標(biāo)識(shí),WEB網(wǎng)頁就是使用這個(gè)ID加載ActiveX控件的
6.定義調(diào)度映射和事件映射方法,提供給外部調(diào)用者使用
那么怎么定義新的調(diào)度映射和事件映射方法呢,如果手動(dòng)定義很不方便,當(dāng)然使用編譯器進(jìn)行定義,步驟是打開類視圖:
可以看到TestMfcAtlDebugLib中有_DTestMfcAtlDebug和_DTestMfcAtlDebugEvents,在_DTestMfcAtlDebug項(xiàng)中可以右鍵-》添加方法(或?qū)傩裕?,該操作是完成調(diào)度映射的方法和屬性的添加;在_DTestMfcAtlDebugEvents項(xiàng)中可以右鍵-》添加方法(或?qū)傩裕摬僮魇峭瓿墒录成涞姆椒ê蛯傩缘奶砑印?/p>
舉個(gè)例子,如果要添加一個(gè)調(diào)度映射的方法Fuck2(),使得外部可以調(diào)用:
在_DTestMfcAtlDebug項(xiàng)中可以右鍵-》添加方法,設(shè)置框
填寫完信息后點(diǎn)擊完成,外部就可以調(diào)用方法Fuck2,同時(shí)ActiveX控件項(xiàng)目代碼的內(nèi)部將會(huì)在三個(gè)文件中新增代碼:
1.在
2.在
3.在
7.注冊(cè)ActiveX控件
按照上面的步驟已經(jīng)完成簡(jiǎn)單ActiveX控件(無窗體界面的控件)的編寫,重新生成后會(huì)在Debug下生成一個(gè)TestMfcAtlDebug.ocx的文件,使用windows的dos窗口可以注冊(cè)這個(gè)ActiveX控件
步驟:
首先win+R鍵打開運(yùn)行,然后輸入注冊(cè)命令:regsvr32 c:\.......\TestMfcAtlDebug.ocx(反注冊(cè)命令:regsvr32 c:\.......\TestMfcAtlDebug.ocx -u)
有兩種情況會(huì)導(dǎo)致控件注冊(cè)失敗:
第一種:使用非Administrator用戶登入系統(tǒng)會(huì)由于權(quán)限不足而無法注冊(cè)com組件,這時(shí)候就必須使用Administrator用戶登入操作系統(tǒng)
第二種:ActiveX控件所依賴的dll庫被程序給占用,就會(huì)導(dǎo)致注冊(cè)失敗,解決辦法是將正在運(yùn)行的程序關(guān)閉就可以
8.測(cè)試ActiveX控件的方法
按照上面的步驟已經(jīng)完成ActiveX控件的編寫,也將這個(gè)控件注冊(cè)成功了,那么怎么測(cè)試這個(gè)控件呢,有三種方式:
第一種:使用html網(wǎng)頁來測(cè)試
在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,然后打開這個(gè)網(wǎng)頁就會(huì)顯示ActiveX控件。上面的classid在控件成功注冊(cè)后也可以通過注冊(cè)表查找,具體方法是win+R鍵,輸入regedit命令,就會(huì)彈出“注冊(cè)表編輯器”,位置在“HKET_CLASSES_ROOT”中,根據(jù)你控件的名稱,快速按下前三個(gè)字母,然后就可以定位到比較好找的位置,如下圖
第二種:建立Mfc應(yīng)用程序,在Mfc窗口右鍵-》插入“ActiveX”控件,然后就會(huì)在MFC的窗體上顯示ActiveX控件
第三種:也是最方便的一種方法,就是使用vs自帶的ActiveX Control Test Container來測(cè)試ActiveX控件,但是VS2010在“工具”中沒有這一項(xiàng),那么我們首先可以手動(dòng)把這個(gè)工具添加到VS2010里,首先找到C:\Program Files\Microsoft Visual Studio 10.0\Samples\2052\C++\MFC\ole\TstCon\TstCon.sln,然后使用VS2010打開解決方案TstCon.sln,編譯項(xiàng)目TCProps和TstCon,編譯完成后會(huì)在C:\Program Files\Microsoft Visual Studio 10.0\Samples\2052\C++\MFC\ole\TstCon\Debug\中生成TstCon.exe執(zhí)行程序,這個(gè)執(zhí)行程序就是ActiveX Control Test Container,接下來我們就在VS2010中的工具中添加這個(gè)TstCon.exe,在VS2010中的“工具”菜單項(xiàng)中選擇“外部工具”,在彈出的窗體中添加一個(gè)新的工具,標(biāo)題為ActiveX Control Test Container,命令為C:\Program Files\Microsoft Visual Studio 10.0\Samples\2052\C++\MFC\ole\TstCon\Debug\TstCon.exe,然后點(diǎn)擊確定就可以完成工具的添加了。
這樣,在“工具”中就有了一個(gè)ActiveX Control Test Container,點(diǎn)擊它就會(huì)彈出測(cè)試ActiveX的容器,如下圖
點(diǎn)擊Edit->Insert New Control->選擇TestMfcAtlDebug Control,點(diǎn)擊OK
然后就會(huì)顯示這個(gè)注冊(cè)后的AcitveX控件,如果要測(cè)試這個(gè)控件的調(diào)度映射的方法Fuck2,就先選中控件,然后點(diǎn)擊Control-》Invoke Methods,在Methods Name下拉框中選擇Fuck2這個(gè)方法,點(diǎn)擊Invoke按鈕就可以測(cè)試這個(gè)方法了,如下圖:
我們可以看到上面的ActiveX控件是一個(gè)空白的背景和一個(gè)圈組成的,并沒有窗體界面,那么怎么添加窗體呢?
9.向ActiveX控件中添加一個(gè)Mfc窗體,就是一個(gè)帶界面的ActiveX控件
步驟:
第一:在資源視圖中新建一個(gè)對(duì)話框資源
去掉上邊的“確定”和“取消”按鈕,然后修改對(duì)話框?qū)傩裕築order改為None,Control改為Ture,ID改為IDD_MAIN_DIALOG,Style改為Child,System改為False,Visible改為True,然后在對(duì)話框中雙擊,為對(duì)話框添加一個(gè)類,如下圖:
點(diǎn)擊“完成”。在解決方案資源管理器中新增了一個(gè)ViewDialog.h和ViewDialog.cpp這個(gè)ViewDialog類就是剛剛我們建立的對(duì)話框類
然后拖一個(gè)Edit Control到對(duì)話框上,修改其ID為IDC_EDIT_OUTPUT,再拖一個(gè)Button到對(duì)話框上,此時(shí)對(duì)話框效果為:
對(duì)話框建立完成,接下來就是要把它添加到ActiveX控件中去
第二:在TestMfcAtlDebugCtrl.h中定義對(duì)話框?qū)嵗齧_VideoDlg
然后在TestMfcAtlDebugCtrl類中定義兩個(gè)消息映射:窗體創(chuàng)建完成消息映射和窗體改變大小消息映射
在VS2010的菜單項(xiàng)“項(xiàng)目”--》“類向?qū)А敝?,選擇要添加到的項(xiàng)目和類中,選擇“消息”選項(xiàng)卡,選擇WM_CREATE后點(diǎn)擊”添加處理程序“按鈕和選擇WM_SIZE
后點(diǎn)擊”添加處理程序“,這樣在“現(xiàn)有的處理程序”中就有OnCreate和OnSize這兩個(gè)函數(shù),點(diǎn)擊確定,完成消息映射函數(shù)的添加,如圖:
在TestMfcAtlDebugCtrl.cpp中自動(dòng)添加下列代碼,如圖:
在OnCreate函數(shù)中編寫如下代碼(Create是在ActiveX控件中創(chuàng)建一個(gè)窗體對(duì)話框,IDD_VIEW_DIALOG就是剛剛新建的對(duì)話框):
在OnSize函數(shù)編寫代碼如下(MoveWindow是確定窗體對(duì)話框在ActiveX中的大?。?/p>
第三:重新編譯,注冊(cè)ocx,使用ActiveX Control Test Container再次測(cè)試該控件
可以發(fā)現(xiàn)這個(gè)ActiveX控件中已經(jīng)有了界面了
以上所述就是本文的全部?jī)?nèi)容了,希望大家能夠喜歡。
相關(guān)文章
Opencv 馬賽克和毛玻璃效果與圖片融合的實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了通過OpenCV實(shí)現(xiàn)馬賽克和毛玻璃濾鏡效果與圖片的融合,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11從txt中讀入數(shù)據(jù)到數(shù)組中(fscanf)的實(shí)現(xiàn)代碼
下面小編就為大家?guī)硪黄獜膖xt中讀入數(shù)據(jù)到數(shù)組中(fscanf)的實(shí)現(xiàn)代碼。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-12-12C++類繼承之子類調(diào)用父類的構(gòu)造函數(shù)的實(shí)例詳解
這篇文章主要介紹了C++類繼承之子類調(diào)用父類的構(gòu)造函數(shù)的實(shí)例詳解的相關(guān)資料,希望通過本文大家能夠掌握C++類繼承的相關(guān)知識(shí),需要的朋友可以參考下2017-09-09基于Windows C++ 應(yīng)用程序通用日志組件的使用詳解
眾所周知,在調(diào)試、跟蹤和執(zhí)行應(yīng)用程序的過程中,程序的日志能為這些工作提供大量有價(jià)值的運(yùn)行信息。因此,程序的日志對(duì)應(yīng)用程序的運(yùn)行、維護(hù)至關(guān)重要2013-05-05