posts - 495,comments - 227,trackbacks - 0
          ??? ActiveX控件是一個(gè)自包含代碼的組件,它有自己的永久狀態(tài),并且ActiveX控件與包容器之間通過COM接口進(jìn)行通信,所以通常ActiveX控件具有普遍的適應(yīng)性,換句話說,如果ActiveX控件在一個(gè)包容器程序中可以運(yùn)行,那么通常它也可以運(yùn)行在另一個(gè)包容器程序中。由于ActiveX控件是一種可獨(dú)立發(fā)布的組件程序,又是一個(gè)永久對(duì)象,這些特性使得它非常適合于Internet環(huán)境。
          從包容器IE而言。IE需要考慮一些與Internet環(huán)境有關(guān)的問題,如許可證檢查,自動(dòng)下載、遠(yuǎn)程數(shù)據(jù)獲取等。
          另一方面從ActiveX控件本身來看,用于桌面環(huán)境的ActiveX控件,為了獲得更強(qiáng)的交互性能,通常它要實(shí)現(xiàn)各種ActiveX控件所要求的接口,所以組件規(guī)模通常很大。為了使程序代碼量盡可能地小,Microsoft Visual C++提供了ATL模板庫作為這類ActiveX控件的基本開發(fā)工具。
          IE要求ActiveX控件必須支持自注冊(cè),以便在用戶瀏覽包含ActiveX控件的WEB頁面時(shí)可以動(dòng)態(tài)地注冊(cè)控件。所以作為ActiveX控件的DLL程序必須引出DllRegisterServer和DllUnregisterServer函數(shù)。

          接口
          功能與說明
          IOleObject
          如果控件要與包容器程序的站點(diǎn)對(duì)象進(jìn)行通信,則須實(shí)現(xiàn)此接口
          IOleInPlaceObject
          IOleInPlaceActiveObject
          如果控件支持實(shí)地激活特性,則須實(shí)現(xiàn)此接口
          IOleControl
          如果控件支持快捷鍵,或者訪問包容器的環(huán)境屬性,或者控件要求包容器處理事件,則須實(shí)現(xiàn)此接口。
          IDataObject
          如果控件提供數(shù)據(jù)對(duì)象的特性,則實(shí)現(xiàn)此接口
          IViewObject2
          如果控件在非實(shí)地激活狀態(tài)下也需要顯示信息,則實(shí)現(xiàn)此接口
          IDispatch
          如果控件有自定義的屬性和方法,則實(shí)現(xiàn)此接口
          IConnectionPointContainer
          如果控件對(duì)象支持一個(gè)或多個(gè)出接口,則實(shí)現(xiàn)此接口。
          IProvideClassInfo[2]
          如果控件對(duì)象要直接通過GetClassInfo成員函數(shù)提供對(duì)象類型信息,則實(shí)現(xiàn)此接口
          ISpecifyPropertyPages
          如果控件對(duì)象支持屬性頁,則實(shí)現(xiàn)此接口
          IPersistStream[Init]
          IPersisStorage
          或其它永久接口
          如果控件對(duì)象支持永久特性的,則至少實(shí)現(xiàn)一個(gè)永久接口
          從理論上講,IE只要求被嵌入的對(duì)象(ActiveX控件以對(duì)象的形式被嵌入在頁面中)實(shí)現(xiàn)IUnKnown接口,但實(shí)際上為了實(shí)現(xiàn)一定的功能,并更好地與IE程序進(jìn)行交互,ActiveX控件還必須實(shí)現(xiàn)其它一些接口。對(duì)應(yīng)的接口與功能對(duì)應(yīng)關(guān)系如下:
          一般的包容器程序通常只負(fù)責(zé)ActiveX控件的創(chuàng)建、運(yùn)行和釋放,但I(xiàn)E要做的事情更多一些。首先,當(dāng)客戶機(jī)上不存在ActiveX控件組件程序時(shí),它必須根據(jù)HTML頁面中指示的地點(diǎn)把組件程序下載過來,并注冊(cè)在客戶機(jī)上,然后再創(chuàng)建對(duì)象,此過程在后臺(tái)自動(dòng)完成,不需要執(zhí)行其它命令。其次,當(dāng)IE把組件程序下載到本地之后,它在創(chuàng)建控件對(duì)象時(shí)可以進(jìn)行許可證檢查,以保證系統(tǒng)安全性,用戶也可拒絕對(duì)象或執(zhí)行初始化。
          ActiveX控件包裝
          通過CLSID指定ActiveX控件的類型,如果要在IE中正確顯示包含ActiveX控件的頁面,則必須事先在機(jī)器上注冊(cè)相應(yīng)的ActiveX控件,否則相應(yīng)的ActiveX就不能顯示。在Internet上使用時(shí),頁面設(shè)計(jì)者不能期望瀏覽器用戶找到你指定的ActiveX控件并注冊(cè)到客戶機(jī)上,為了解次這個(gè)問題,我們可以用“codebase”屬性指定控件的代碼位置:
          <OBJECT CLASSID=”CLSID:2885EE05-A26B-11d1-B49B-00c04F98EFE0”
          ???????? Codebase=http://webserver/Pollgon.dll
          ??? ?ALIGN=”CENTER” WIDTH=200 HEIGHT=200 ID=”PolyCtl”> </OBJECT>
          以上指定了Polygong控件程序“http://webserver/Pollgon.dll”,當(dāng)瀏覽器碰到這樣的描述時(shí),它會(huì)把codebase指定的程序下載到本地(在系統(tǒng)目錄的“Downloaded Program Files”子目錄下),然后調(diào)用組件程序的自注冊(cè)入口函數(shù)注冊(cè)到當(dāng)前系統(tǒng)中,以后的創(chuàng)建都在本地進(jìn)行,不再涉及codebase屬性。
          ?
          因?yàn)锳ctiveX控件的程序代碼需要在Internet上傳輸,所以使用壓縮技術(shù)傳輸程序代碼非常有意義。另一方面,如果ActiveX控件還調(diào)用到其它的DLL程序模塊,那么IE也必須把這些程序下載到本地來,為此,Microsoft采用了慣用的CAB壓縮方法,它把ActiveX控件程序以及相關(guān)的其它文件放到同一個(gè)CAB文件中,然后在codebase屬性中指定CAB文件的URL路徑。
          ?
          IE對(duì)CAB文件的處理過程如下:
          1.?IE在解析“OBJECT”標(biāo)記時(shí),它繼續(xù)查找codebase屬性。
          2.?如果找到了codebase屬性,并且codebase指定了ActiveX控件的CAB文件,那么IE定位到CAB文件。
          3.?IE把CAB文件中的有關(guān)文件解壓出來,并放到客戶機(jī)的臨時(shí)目錄(系統(tǒng)目錄的“Downloaded Program Files”子目錄下)中。
          4.?IE注冊(cè)有關(guān)的文件。
          5.?IE調(diào)用COM API函數(shù)創(chuàng)建ActiveX控件對(duì)象。
          CAB文件包含了ActiveX控件注冊(cè)和運(yùn)行時(shí)所需要的必要信息。通常一個(gè)CAB文件包含一個(gè)INF文件,INF文件是一個(gè)文本文件,它描述了CAB文件的所有細(xì)節(jié)信息。如以下的INF文件例子。
          [version]
          Signature=”$CHICAGE$”
          AdvancedINF=2.0
          [Add.Code]
          MyCtrl.ocx = MyCtrl.ocx
          Msvcrt.dll = msvcrt.dll
          Mfc42.dll = mfc42.dll
          Olepro32.dll = olepro32.dll
          [MyCtrl.ocx]
          File-win32-x86=thiscab
          Clsid = {2885EE05-A26B-11d1-B49B-00c04F98EFE0}
          FileVersion = 1,0,0,0
          RegisterServer = yes
          ?
          [msvcrt.dll]
          FileVersion = 4,20,0,6164
          Hook = mfc42installer
          [mfc42.dll]
          FileVersion=4,2,0,6256
          Hook=mfc42installer
          [olepro32.dll]
          FileVersion = 4,2,0,6068
          Hook = mfc42installer
          [mfc42installer]
          File-win32-x86=http://activex.microsoft.com/controls/vc/mfc42.cab
          Run = %EXTRACT_DIR% \mfc42.exe
          ?
          [Version]給出了INF文件的基本版本信息,“signature=”一行說明此INF文件可適用于32位
          Windows操作系統(tǒng); “AdvancedINF=”一行要求IE必須裝入2.0版以上的Advpack.dll模塊才能解析此INF文件。
          [Add.Code]是INF文件的主體部分,它列出了所有ActiveX控件需要的文件以及每個(gè)文件所對(duì)應(yīng)的部分名稱。MyCtrl控件是MFC開發(fā)的,所以它需要用到MFC的動(dòng)態(tài)連接庫文件,所以,這一部分中列出了MyCtrl控件所必須的四個(gè)文件:MyCtrl.ocx、msvcrt.dll、mfc42.dll和olepro32.dll。
          [MyCtrl.ocx]部分描述了MyCtrl控件組件程序MyCtrl.ocx的信息,包括此程序所在的CAB文件位置(thiscab指自身)以及MyCtrl控件的CLSID信息。”FileVersion=”指明了MyCtrl.ocx的版本;”RegisterServer=yes”說明此文件在使用之前要預(yù)先被注冊(cè)。
          [msvcrt.dll] [mfc42.dll] [olepro32.dll]部分分別說明了相應(yīng)的文件版本,并把進(jìn)一步信息指向最后的[mfc42installer]部分。
          [mfc42installer]部分中,“file-win32-x86=”指明了MFC42.CAB文件的URL路徑,”run=”指明了運(yùn)行的命令
          ?
          可用Cabarc.exe工具生成CAB文件,如:
          Cabarc.exe N MyCtrl.cab MyCtrl.ocx MyCtrl.inf
          ?
          ATL產(chǎn)生的Activex控件所對(duì)應(yīng)的INF文件如下:(可作為ATL開發(fā)的樣板)
          [version]
          ??? Signature=”$CHICAGE$”
          ?? ?AdvancedINF = 2.0
          [Add.Code]
          ??? Polygon.dll = polygon.dll
          ??? Atl.dll = atl.dll
          [atl.dll]
          ??? File-win32-x86=thiscab
          ??? FileVersion = 3,00,0,8166
          ??? DestDir = 11
          ??? RegisterServer=yes
          ?
          [Polygon.dll]
          ??? File-win32-x86=thiscab
          ??? Clsid = {2885EE05-A26B-11d1-B49B-00c04F98EFE0}
          ??? FileVersion=1,0,0,1
          ??? RegisterServer=yes
          ?
          這里新出現(xiàn)的標(biāo)記為“DestDir=”,它是指文件下載過來之后存放的目標(biāo)目錄,“11”表示
          Windows的系統(tǒng)目錄(“Windows\System” 或 “WInnt\System32”);“10”指windows目錄
          (windows或winnt)。根據(jù)INF文件生成的CAB文件命令為:
          Cabarc.exe N Polygon.cab ?atl.dll Polygon.dll Polygon.inf
          ?
          CAB文件也支持?jǐn)?shù)字簽名,我們?cè)诶胏abarc.exe工具生成CAB文件時(shí)可以用 –s命令行
          參數(shù)預(yù)留數(shù)簽名空間,然后運(yùn)行實(shí)用工具SIGNCODE,加入數(shù)字簽名即可。
          ?
          許可證管理
          ??? 除了免費(fèi)發(fā)行的ActiveX之外,大多數(shù)ActiveX控件都支持設(shè)計(jì)時(shí)刻運(yùn)行時(shí)刻的許可
          證檢查。設(shè)計(jì)時(shí)刻許可證檢查可以保證程序員在創(chuàng)建就用系統(tǒng)或者WEB頁面時(shí)使用合法的
          ActiveX控件;運(yùn)行時(shí)刻許可證檢查可以保證用戶運(yùn)行一個(gè)包含合法的控件的就用系統(tǒng)或者
          顯示一個(gè)包含合法控件的Web頁面。
          ??? 由于許可證檢查是在ActiveX控件被創(chuàng)建時(shí)進(jìn)行的,所以不管是設(shè)計(jì)時(shí)刻許可檢查還是
          運(yùn)行時(shí)刻許可檢查,實(shí)現(xiàn)的關(guān)鍵在于ActiveX控件的類廠對(duì)象。如果ActiveX控件支持許可
          檢查,那么其類廠對(duì)象必須支持IClassFactory2接口。此接口是IClassFactory的擴(kuò)展。
          ??? 許可證是一段文本信息,它可以存放在單獨(dú)的文件中,也可以存放在組件程序二進(jìn)制代
          碼中或者就用程序中。但作為ActiveX控件組件程序,它只需實(shí)現(xiàn)IClassFactory2接口的三
          個(gè)成員函數(shù),對(duì)于許可證的管理和用法取決于包容器程序。不同類型的包容器程序?qū)υS可證
          的處理有所不同,并且設(shè)計(jì)時(shí)刻與運(yùn)行時(shí)刻對(duì)許可證的處理也有所不同。
          在創(chuàng)建包含ActiveX控件的應(yīng)用程序時(shí),包容器(VB或其它開發(fā)工具)調(diào)用
          IClassFactory2::GetLicInfoRequestLicKey函數(shù)獲取許可證,然后嵌入到應(yīng)用程序的二進(jìn)制
          代碼中。在運(yùn)行應(yīng)用程序時(shí)刻,作為包容器程序的應(yīng)用程序在創(chuàng)建ActiveX控件時(shí),調(diào)用
          IClassFactory2::CreateInstanceLic函數(shù)創(chuàng)建控件對(duì)象,與設(shè)計(jì)時(shí)刻不同的是,它在bstrKey
          參數(shù)中傳遞有效的許可證字符串(內(nèi)嵌在程序中)而不是NULL。所以這樣的程序可以
          在任何一機(jī)器上運(yùn)行,而不用擔(dān)心許可問題
          ??? 對(duì)于IE這樣的包容器程序,它也調(diào)用IClassFactory2的成員函數(shù)進(jìn)行許可檢查,但由于
          ActiveX控件被包含在Web頁面上,任何瀏覽器都可以訪問到Web頁面,并且IE在創(chuàng)建控
          件之前已經(jīng)把程序代碼下載到本地,所以IE需要其它的方式把許可證隱藏起來,以避免許
          可證被非法濫用。Microsoft為此引進(jìn)了許可證包文件(license package file,文件名后綴為
          LPK)
          ??? 許可證文件格式共分四部分:
          1.?LPK文件頭。包含信息“LPK License Package”。
          2.?版權(quán)信息。對(duì)版權(quán)的解釋以及對(duì)非法拷貝的警告。
          3.?LPK文件的版本和GUID。文本信息,也標(biāo)識(shí)了真正許可證數(shù)據(jù)的開始。
          4.?UUENCODED(Base64)碼對(duì)許可證進(jìn)行編碼。包含多個(gè)對(duì)象(CLSID)與相應(yīng)的許可證(UNICODE字符串)
          IE包含一個(gè)許可證管理器組件,它負(fù)責(zé)解析LPK文件,并提取出每個(gè)CLSID的許可證。當(dāng)
          IE要顯示ActiveX控件時(shí),它通過許可證管理器組件從LPK文件提取出許可證,然后調(diào)用IClassFactory2::CreateInstanceLic函數(shù)創(chuàng)建ActiveX控件對(duì)象,如果它指定的許可與ActiveX控件內(nèi)部的許可證相匹配,那么ActiveX控件就會(huì)被創(chuàng)建并在頁面上顯示。
          創(chuàng)建許可證包文件可以使用Microsoft提供的實(shí)用工具LPK_TOOL.EXE。為所指定的ActiveX控件生成相應(yīng)的LPK文件。一旦生成了LPK文件,并可在WEB頁中使用,如:
          <OBJECT CLASSID=”clsid: 2885EE05-A26B-11d1-B49B-00c04F98EFE0”>
          <PARAM NAME=”LPKPATH” VALUE=”MyPage.lpk”>
          </OBJECT>
          LPK文件針對(duì)整個(gè)WEB頁面,而不是單個(gè)ActiveX控件,所以每個(gè)WEB頁面只能使用一個(gè)LPK文件。
          ?
          WEB頁面中ActiveX控件的初始化
          在“OBJECT”標(biāo)記的“DATA”屬性中指定包含屬性數(shù)據(jù)文件的URL文件名。如果DATA屬性包含URL文件名,那么包容器就創(chuàng)建一個(gè)URL名字對(duì)象,并且調(diào)用ActiveX控件IPersistMoniker接口的Load成員函數(shù)執(zhí)行初始化。ActiveX控件調(diào)用名字對(duì)象的IMoniker::BindToStorage函數(shù)以便獲取屬性數(shù)據(jù)并進(jìn)行初始化。
          如果ActiveX不支持IPersistMoniker接口,則IE會(huì)請(qǐng)求其它的永久接口,然后獲取屬性數(shù)據(jù),必要時(shí)打包到流對(duì)象中,再調(diào)用永久接口的LOAD成員函數(shù)。于是ActiveX控件就可通過流對(duì)象得到屬性數(shù)據(jù)。
          以下HTML說明在Web頁面中為ActiveX控件指定屬性數(shù)據(jù)的方法
          <OBJECT CLASSID=” 2885EE05-A26B-11d1-B49B-00c04F98EFE0”
          ???????? CODEBASE=”http://webServer/MyCtrl.cab
          ???????? Data=”http://webServer/Mydata.dat
          ???????? ID=”MyCtrl”></OBJECT>
          有時(shí)候ActiveX控件的屬性數(shù)據(jù)量很小,可以只用一些數(shù)值或字符串就把屬性表達(dá)出來。這種情況下,使用流方式的屬性表達(dá)式就沒有必要,可以在HTML中使用“
          PARAM”關(guān)鍵字對(duì)ActiveX控件的屬性進(jìn)行賦值。如:
          <OBJECT CLASSID=” 2885EE05-A26B-11d1-B49B-00c04F98EFE0”
          ???????? CODEBASE=”http://webServer/MyCtrl.dll”>
          ???????? <PARAM NAME = “Sides” VALUE = 5>
          </OBJECT>
          ?
          posted on 2007-03-08 17:26 SIMONE 閱讀(5958) 評(píng)論(2)  編輯  收藏 所屬分類: C++

          FeedBack:
          # re: 基于internet的ActiveX 控件開發(fā)使用方法
          2009-01-15 21:30 | 游客
          不錯(cuò),先頂
          再學(xué)習(xí)  回復(fù)  更多評(píng)論
            
          # re: 基于internet的ActiveX 控件開發(fā)使用方法
          2009-01-16 20:40 | 游客
          我也頂一下
          再詳細(xì)地把步驟寫出來就更好了  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 资溪县| 左云县| 海南省| 长兴县| 桑植县| 永新县| 象山县| 景德镇市| 邯郸县| 平陆县| 临朐县| 县级市| 沙湾县| 南和县| 屏南县| 望奎县| 汤阴县| 定南县| 云梦县| 获嘉县| 扎赉特旗| 陈巴尔虎旗| 海盐县| 闸北区| 平谷区| 小金县| 辰溪县| 克什克腾旗| 缙云县| 清原| 什邡市| 千阳县| 长春市| 武功县| 临泉县| 许昌市| 谢通门县| 榆社县| 枞阳县| 孝感市| 丹棱县|