天天看點

COM元件開發實踐(一)

Preface

      因為項目需要,開始從事ActiveX方面的工作,看了一些資料,可惜都是些COM原理方面的,沒有切合實際動手的東西,在CodeProject上讀完David Marcionek的文章【1】後,收獲良多,但也遇到一些惱人的小問題,是以在其基礎上就一些易錯點做些小注解。本文版權歸David Marcionek所有。

簡介 

本文目的在于讓你快速掌握ActiveX控件開發技術,将會展示開發ActiveX應該知道的基本概念,如方法,屬性和事件,以及如何在一個ActiveX控件和一個web頁面之間進行通信

在本文中,我們将建立一個ActiveX控件,當加載控件時,它會顯示一個動畫進度條,以便向使用者表明控件正在加載。此控件會包含展示如何在控件和web頁面間傳遞資訊的功能。下面我們會使用VS2005一步步進行開發的。

建立一個ActiveX控件

為了建立一個ActiveX控件,如下所示:

1,建立一個"MFC ActiveX Control"項目,取名MyActiveX,

2,在"MFC ActiveX Control Wizard"對話框中,選中"Control Settings"

3,在"Create control based on"中選擇"STATIC".我們将使用靜态控件,因為我們隻是顯示從控件中擷取的輸出資訊,并不接受輸入資訊。

4,在"Additional features"中,確定"Activates when visible"和"Flicker-free activation"被選中,"Has an About box dialog"不選中。

5,預設情況下,wizard會建立一個項目,使其在一個共享DLL中使用MFC.我們必須更改這種情況,因為除非所需的MFC DLL都已經在系統中安裝了,否則ActiveX控件就不能運作。包含ActiveX控件的Web頁面上出現紅叉的一個原因就是此。在項目的屬性中,"Configuration Properties"-->"General",将“Use of MFC” 改為“Use MFC in a Static Library”.

6,向導會建立如下幾個類:

      1)CMyActiveXApp:這是ActiveX應用程式類,從COleControlModule類繼承下來的。它是OLE控件子產品對象繼承自的基類,包含了初始化(InitInstance)和清理(ExitInstance)的代碼

      2)CMyActiveXCtrl:從COleControl繼承而來,這裡是我們實作控件大部分功能的地方。

      3)CMyActiveXPropPage:從COlePropertyPage繼承而來,用于管理控件的屬性頁對話框。向導已經為我們建立了一個預設的對話框來作為控件的屬性頁對話框。

增加動畫GIF支援

      這裡我們使用了一個CPictureEx類(具體代碼見最後的“資源”部分),vs2005增加一個動畫GIF資源有一個bug(其實在vs2008中也存在),我們可以使用下面這種技巧來回避它:

将ProcessingProgressBar.gif拷貝到項目檔案夾下,然後更名為ProcessingProgressBar.gaf,在資源視圖中,右鍵資源檔案MyActiveX.rc,選擇“添加資源”。在“添加資源”對話框中,按下”導入“按鈕,并選擇ProcessingProgressBar.gaf檔案。在”自定義資源類型“對話框中輸入“GIF”作為資源類型。這就會将GIF圖檔檔案導入項目中。然後将導入的圖檔ID從

IDR_GIF1

 改為

IDR_PROGRESSBAR

.。

現在開始着手恢複原狀,首先,打開MyActiveX.rc的源檔案,找到

IDR_PROGRESSBAR

的定義,将其檔案名改為

ProcessingProgressBar.gif”.同樣地,把項目檔案夾下的圖檔檔案名也改回為“ProcessingProgressBar.gif”,最後在“解決方案資料總管”視圖中,選中ProcessingProgressBar.gaf,在其”屬性“中,修改”相對路徑“為” ."ProcessingProgressBar.gif”.

增加對話框

      現在,我們為進度條圖像增加一個對話框。

1, 在“資源“視圖中,右鍵”對話框“,選擇”插入對話框“來建立一個預設的對話框。

2, 删除預設産生的“确定“和”取消“按鈕,調整對話框大小為230*40。

3,

更改對話框ID為

IDD_MAINDIALOG

,并修改對話框屬性:

Border—none,

 Style – Child, System Menu – False, Visible – True.

4,

在對話框中加入一個圖檔控件,調整其大小為

200*20

,更改控件

ID

IDC_PROGRESSBAR

,顔色為

“white”

5,

為對話框建立一個類,名為

CMainDialog,

現在我們為類增加成員變量:

1,

CMyActiveXCtrl

類增加一個變量

m_MainDialog

,類型為

CMainDialog

2, 

CMainDialog

類增加一個變量

m_ProgressBar

,類型為

CPictureEx

,這裡注意確定

控件變量

選中,并且對于的控件是

”IDC_PROGRESSBAR”.

增加支援代碼

好了,現在加入一些代碼來繪制主對話框和進度條控件吧。

1

,為

CMyActiveXCtrl

處理

WM_CREATE

事件的代碼,在其中加入:

m_MainDialog.Create(IDD_MAINDIALOG, this);

并在

OnDraw

函數中加入:

m_MainDialog.MoveWindow(rcBounds, TRUE);

CBrush brBackGnd(TranslateColor(AmbientBackColor()));

pdc->FillRect(rcBounds, &brBackGnd);

     2.在

CMainDialog

類中,加入處理

WM_CREATE

事件的代碼,在其中加入:

if(m_ProgressBar.Load(MAKEINTRESOURCE(IDR_PROGRESSBAR),_T("GIF")))

m_ProgressBar.Draw();

Ok,一個簡單的ActiveX控件已經開發完畢,設定編譯模式為“Release”模式,并建構整個應用程式。

建立一個

Web

頁面作為

ActiveX

控件容器

可以使用微軟的

ActiveX Control Pad

。要利用它在Web頁面中插入一個ActiveX控件,在<BODY>标記中右鍵,選擇“Insert ActiveX Control”,選擇你需要的就可以了。

直接打開

Web

頁面或者放到

IIS

伺服器上進行通路,一切順利的話就可以看到下面的圖像:

注1:前面要求設定編譯模式為“

Release”

,其實是為了避免運作時因為觸及

Assert

出錯而做的,否則會報錯如下:

跟蹤調試後會發現:

可以看出是圖檔擴充控件加載時的順序有些問題,但在浏覽器中并不需要考慮如此多,是以這裡忽略此

Assert

條件。

注2:作

者在這裡沒有對MyActiveX.idl檔案進行講解,我認為是一個不小的失誤,也正是因為如此,才會導緻一個很容易犯錯的地方,當我們按照他的教程,仿照他的代碼一步步進行完後,卻發現在ActiveX測試容器中是可以運作通過的,但到了浏覽器中卻死活都是紅叉叉。。。,就是因為作者忽略了其對MyActiveX.idl接口定義檔案的修改進行解釋。

注3:VS2008中沒有ActiveX控件測試容器了,VS05以上的數字簽名工具也改變了,是以使用VS2005可能更好

     我按照教程一步步模仿着做的時候,在上面這兩點上糾纏了3個多小時才發現問題的原因。

     在下一篇文章中,将介紹如何對

ActiveX

控件進行數字簽名并使其自注冊和銷毀來確定其安全性,此外還會介紹如何在

ActiveX

控件和

Web

頁面間進行資料通信。

參考資源

1,

A Complete ActiveX Web Control Tutorial

 By David Marcionek

2. 

Add GIF-animation to your MFC and ATL projects with the help of CPictureEx and CPictureExWnd

 by Oleg Bykov, CodeProject.

作者:

洞庭散人

出處:

http://phinecos.cnblogs.com/

    

本部落格遵從

Creative Commons Attribution 3.0 License

,若用于非商業目的,您可以自由轉載,但請保留原作者資訊和文章連結URL。

繼續閱讀