基於ActiveX 控制項開發動態Web頁

來源:互聯網
上載者:User

原文地址:

http://softsky.jblog.cn/160063.shtml  

Web頁面的開發主要分為三類:靜態Web頁面、半動態Web頁面以及Client端動態網頁面。本文重點論述基於ActiveX Control(控制項)動態即時頁面的開發。

  ActiveX控制項用於Web的過程是將控制項嵌入首頁中,使用者通過瀏覽器訪問該首頁時,將首頁中的控制項下載,並在使用者機器上註冊,以後就可在使用者的瀏覽器上運行。控制項下載一次後就駐留在使用者本地機器上,下次再訪問相同的首頁時,可不再下載該控制項,而是直接運行使用者本地的控制項。這裡控制項容器就是瀏覽器,使用者不需要通過瀏覽器調用控制項的屬性或方法。因此,開發面向Web的ActiveX控制項比開發案頭的控制項還要簡單些,所複雜的是如何將該控制項很好地嵌入首頁,使使用者能正常瀏覽。下面介紹這個問題。

在Web頁中加入ActiveX 控制項
  在HTML頁面中使用ActiveX控制項包含三個基本操作:將控制項放入HTML中;將該控制項下載給使用者;在使用者機器上安裝該控制項。如果只是針對IE使用者,在HTML中插入ActiveX控制項就比較簡單;如果同時兼顧IE和Netscape使用者,則要做更多工作。大家知道,HTML檔案由文本和各種標誌(tags)組成,ActiveX 控制項對於IE在HTML中的標誌是<OBJECT>,該標記有幾個重要的參數特性,它們是:

  1.ID:為控制項提供一個標識名稱,為HTML代碼提供一種訪問該控制項的方式。

  2.CLASSID:是該控制項唯一的UUID,告訴IE裝入哪個對象。如果使用已經開發好的控制項,它的CLASSID可以通過調用Win95或NT下的應用Regedit來尋找。從開始菜單中運行該程式,展開HKEY_CLASSES_ROOT項,可以看到按字母順序排列的註冊表,找到需要使用的控制項名,例如WClnt,展開時可看到一個CLSID檔案夾,裡面就是該控制項的CLASSID。

  如果是自己用VC開發控制項,該UUID可以在ActiveX控制項項目中的ODL(對象描述庫)檔案中找到;通過查看控制項的類資訊注釋來定位特定控制項的UUID,例如,要找到CMyControl控制項的UUID,則需要找到以下代碼:

  // Class information for CMyControl

  [uuid (051C4748-1262-11D2-87C1-00A024D948FB),

  licensed,

  helpstring(“CmyControl Control”), control ]

  uuid後面括弧中的內容就是該控制項的UUID。

  3.CODEBASE:如果在使用者機器上沒有控制項的目前的版本,該參數告訴使用者瀏覽器在哪裡可找到要下載的控制項和最新版本號碼.當控制項作了修改後,可以更改版本號碼強制使用者重新下載。

  4.PARAM:該標記用於設定控制項的初始屬性值,它有兩個特性:Name和value,即屬性名稱和屬性值。

  此外還有一些標記,如:Width表示該控制項所佔的寬度,Height表示高度等,總體來說,這樣一個插入控制項的HTML代碼和插入Java Applet的HTML代碼非常相似。

  下面是一個嵌有ActiveX控制項的HTML程式碼範例:

 

ID=“CMyControl”

CLASSID=“clsid:051C4748-1262-11D2-87C1-00A024D948FB ”

CODEBASE=“http://www.mysite.com.cn/ocxdir/mycontrol.ocx#version=1,0,0,1”

WIDTH=400

HEIGHT=200

ALIGN=center

HSPACE=0

VSPACE=0

  如果希望控制項還能在Netscape中運行,除了Netscape需加裝外掛程式外,HTML也要加一些附加標記,下面的例子中EMBED段就是為Netscape加上的。如果使用MFC開發OCX控制項,則少數使用者第一次訪問時除了下載OCX檔案外,還要下載相應的MFC DLL,下載量變大,這時可將相關檔案在伺服器端打包成可以在用戶端自解壓安裝的CAB檔案。經過修改後的HTML程式碼片段如下:

<ALIGN=“CENTER” CLASSID=“clsid:

7BCA18C6-2178-11D2-87C1-00A024D948FB”

WIDTH=“1200” HEIGHT=“900” ID=“marquee”

CODEBASE=“http://218.168.188.188/scadaweb/

WClnt.cab#version=1,0,0,1”>

<EMBED ALIGN=“CENTER”CLASSID=“clsid:7BCA18C6- 2178-11D2-87C1-00A024D948FB”

WIDTH=“1200” HEIGHT=“900” ID=“marqueequot;”

CODEBASE=“http://218.168.188.188/scadaweb/

WClnt.OCX#version=1,0,0,1”

TYPE=“application/oleobject” >

即時動態網頁面的實現方案
  對即時動態網頁面的要求多產生於一些要求自動更新即時資料的應用中,如電網監控、股市監測等。具體要求是:使用者只需選取希望瀏覽的圖表,但無需介入操作,該圖表就能根據即時資料不斷更新,使用者總能觀察到最新情況。

  要實現上述功能,結構上有兩種方案:一種是設定一個中繼伺服器,該伺服器作為控制項和後台系統資訊交流的中介;另一種是不設中繼伺服器,但在提供即時資料的後台伺服器上留出供控制項通訊用的資料介面,控制項可以直接從後台伺服器上定時獲得當前即時資料。按資料提供方式分也有兩種:一種是由用戶端定時向伺服器發出請求,指明需要的即時資料,伺服器收到請求後將滿足請求的動態資料發送至相應客戶;另一種是用戶端只請求一次,伺服器端便定時將滿足請求的即時資料傳到用戶端,直到客戶更換要顯示的圖表或停止重新整理。上述各方案都有其優點和局限,在應用中可考慮實際情況採用相應方案。

  工作流程為:使用者先從Web伺服器上下載包含ActiveX 控制項的網頁,控制項隨即在客戶機上註冊運行,並通過Winsock同中繼伺服器或直接同提供即時資訊的網,如股票資訊網相串連,定時取得動態即時資料,並重新整理顯示。在這個體系中,客戶有兩條線路獲得資訊,一條是和Web Server的串連,從這條線上使用者訪問首頁;另一條就是控制項和後台資訊網的串連,從這條線路上使用者可以訪問即時資料。後一條線路用Winsock建立,傳輸速度遠大於前一條線路,且控制靈活、效率高,不和首頁下載爭資源。通過這條線路,使用者甚至可以傳送遠端控制資訊實現遙控操作。

利用MFC開發ActiveX控制項
  利用VC5.0開發的這種控制項,功能可擴充性強,理論上獨立的VC5.0程式具有的功能,該控制項都能實現,例如控制項直接繪製瀏覽器,可以使用OpenGL等圖庫,圖形映像功能強大。即時資料重新整理頻率理論上可達毫秒級,使用者通過滑鼠可以實現各類互動操作,如旋轉、縮放,圖2就是一幅GL圖形,並有一個縮放工具條進行縮放操作。如果是在電腦上觀看,可以看到這幾個三維圖在不斷旋轉。

  應該說,較好的開發工具可直接用API編程或使用ATL模板庫,利用MFC開發ActiveX控制項不是一個好的選擇,因為控制項運行需要MFC DLL的支援。假如客戶機器上沒有這些類庫(這種情況很少,但確實存在),第一次下載就要花費些工夫。不過對於熟悉MFC的開發員來說,這些問題相對MFC提供的便利來說都是可以忽略的。

  由於VC5.0對ActiveX控制項的開發提供了許多便利,所以開發一個ActiveX控制項並不像許多人想象中的那麼困難複雜,通過VC 5.0的AppWizard,實現控制項的主類從ColeControl類派生出來,該類則是CWnd的一個子類,所以你可以像對視窗類別編程一樣對這個主類編程。為了實現上面提及的功能,首先必要重載它的OnDraw函數加入需要繪製的對象,加入Winsock類(CSocket或CAsyncSocket),以實現與後端資料服務器的通訊。如果需要用OpenGL繪製豐富多彩的立體圖,則要初始化GL環境。其他的工作就在於使用者如何控製程序的調度,使得各功能都能正常工作且與其他部分正常通訊。此外,後端伺服器程式也要增加對應於該控制項的介面。

  這樣的一個程式編譯通過後,就成為一個可用於Web的控制項,尾碼名是OCX。按照前面敘述的方法將該OCX置入首頁,基本的工作就算完成。

  綜上所述,利用VC5.0開發ActiveX控制項用於Web瀏覽,主要有以下幾個特點:

  1.採用Winsock的通訊機制,速度快、控制靈活、效率高;

  2.控制項採用VC5.0編製,功能可擴充性很強;

  4.控制項第一次下載雖然稍費時間,但下載後即在使用者機上註冊,以後可直接調用,速度效率均好;

  5.ActiveX技術是微軟發展的重中之重,且已成為當前軟體發展的潮流所向,發展空間廣闊;

  6.系統採用VC開發,可以利用已有的採用C語言編製的系統,開發工作量大大減 

 

關於討論:

我近來也在學習寫ActiveX控制項。我用的VB寫,現看來VC好像也不錯呀。不過我寫的打包成CAB很大。不知道應該如何處理。
還有就是用ActiveX儲存使用者提交的資料到伺服器的資料庫出錯,不能找到資料庫檔案,發現它是在本地找!這應該怎麼辦呀?

看到你的Blog很喜歡。希望能向哥子你學習。
我的QQ是9480590,哥子你有QQ嗎?

以下為blog主人的回複
你要上傳到伺服器,就得在控制項中進行伺服器的串連與上傳,如果只是單純的上傳哪是不行的,因為你的操作是相對於本地而言,實際上並沒有和伺服器有聯絡。不知清楚沒有。
QQ: 274043505

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.