標籤:style blog class java tar ext
最近工作項目,BS中需要用到網路攝影機拍照,需要儲存本地,同時上傳到伺服器,嘗試使用vc++做ActiveX來實現.
完全沒有使用過vc,上網搜尋各種知識,初步完成.在這裡記錄下有協助的資料.
第一步:編寫一個ActiveX
第二部:使用vfw.h開發網路攝影機拍照功能
第三步:裁剪,轉換圖並上傳
轉載出處:http://blog.csdn.net/longhuahaha/article/details/8556964
1.ActiveX的基本概念
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.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,代碼如下:
[cpp] view plaincopyprint?
- #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] view plaincopyprint?
- <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控制項中已經有了介面了